我有一個代理類發出請求對象,並期望它們被傳回給它,並將一些屬性更改爲明智的值。問題是,的消費者表示,券商必須從未更改該對象的一對夫婦的只讀屬性,也可以創建不同的請求實例作弊是隻讀保護或經紀人將打破,並拋出一個異常。如果代理的任何類保存嘗試創建請求對象,我想找到一種方法來使編譯失敗。如何確保只有一個類可以創建一個A.B實例?
我認爲密封請求對象的實例化,所以它只能從代理內部完成本身是一個整潔的想法,加上只讀屬性,所以請求處理器永遠不會欺騙系統,但我很難做到這一點。我試過一個像這樣的私人構造函數的子類:
public class PermissionsRequestBroker {
public PermissionsRequest Test() {
return new PermissionsRequest();
}
private class PermissionsRequest {
private PermissionsRequest() {
}
}
}
但它失敗了,因爲代理無法創建請求對象。
我嘗試過類似的方法,但用的接口是這樣的:
public class PermissionsRequestBroker {
public IPermissionsRequest Test() {
return new PermissionsRequest();
}
public interface IPermissionsRequest {
}
private class PermissionsRequest : IPermissionsRequest {
public PermissionsRequest() {
}
}
}
但請求處理器可以實現IPermissionsRequest和欺騙系統的方式。當然,我可以實現一個運行時檢查,以便返回的對象仍然是代理的PermissionRequest對象,但這仍然是一個運行時檢查,並會引發異常。
我所有的異常,但我覺得必須有某種方式來強制執行該合同在編譯時,無需安裝任何形式的IDE擴展或NuGet包。
什麼問題是你想解決? 「欺騙」是什麼意思,你不相信你的圖書館的用戶?你看過'sealed'關鍵字嗎? – Aron
爲什麼你在第一個案例中使構造函數保密?在班級本身是私人的時候不會公開,而不是公開解決你的問題? – Madhusudhan
@Aron PermissionRequest實例具有絕對不能更改的RequestId屬性。IE:如果經紀人向您發送一個帶有Id:0的請求,那麼經紀人會希望您使用同一個ID回覆,否則經紀人本身會中斷並回復不同的請求源。 – Machinarius