2016-03-24 145 views
0

上下文的位編譯時檢查

我有一個類,它在「處理程序」,像這樣:

interface IHandler 
{ 
    void DoSomething(MyType type, string s); 
} 

public class MyType 
{ 
    private IHandler handler; 

    public MyType(IHandler handler = null) 
    { 
     this.handler = handler; 
    } 

    public void DoSomething(string s) 
    { 
     handler?.DoSomething(this, s); 
    } 
} 

問題

我要確保IHandler中的所有方法都在MyType中執行,而不需要第一個參數MyType type,這將填充到我與this處理程序調用。

我的問題

是否有允許這樣的事情的模式?我想從IHandler繼承MyType,但這需要調用者指定在調用中的類型,這打破了目的。我也可以確保它們都被手動調用,但接口將變得非常龐大,並且可能會有一些父接口。這是我最後的手段。如果需要的話,我並不介意更改代碼。

我這個

目標,我希望能夠在MyType類添加行爲,同時允許處理器爲空(不添加行爲)。我選擇了這種模式,但我只是在計劃代碼,所以改變任何可以給我這些功能的東西都會很棒。

+0

如果你把它改成'DoSomething的(字符串s)'然後當你實現它在'MyType'你不需要通過MyType的一個實例,因爲它是一個MyType? – juharr

+0

@juharr由於IHandler可能處理多種類型的MyType,我需要知道它在'IHandler'方法中的哪一個! :) –

+0

這聽起來像你可能會更好[泛型](https://msdn.microsoft.com/en-us/library/512aeb7t.aspx0)。我仍然不完全確定你想要達到的目標。 – RoadieRich

回答

0

爲什麼MyType本身實現了它不會繼承的接口方法?如果你不得不添加IAnotherHandler與另一套方法?

MyType看起來像一個包裝,呼籲IHandler方法沒有指定MyType。如果處理程序由MyType創建的,那麼你可以傳遞this作爲構造參數(保持密封,沒有它,你可以簡單地做一個財產分配this

public class MyType 
{ 
    public IHandler Handler { get; } 

    public MyType() { } 

    public MyType(IHandlerFactory factory) 
    { 
     // create instance via factory 
     Handler = factory.CreateHandler(this); 
    } 
} 

現在你應該可以通過屬性來調用處理方法:

var test = new MyType(new ConcreteFactory()); // with handler 
// var test = new MyType(); // without handler 
test.Handler?.DoSomething("test"); // you will have to check for `null` always 

它應該很容易更多的方法來處理以上的處理程序添加到MyType而不需要修改太多的代碼。


我會用基類的處理程序:

abstract class Handler 
{ 
    MyType _type; 

    public Handler(MyType type) 
    { 
     Type = type; 
    } 

    public abstract void DoSomething(string s) { ... } 
} 

class ConcreteHandler: Handler 
{ 
    public override void DoSomething(string s) { ... } 
} 

interface IHandlerFactory 
{ 
    Handler CreateHandler(MyType type); 
} 

class ConcreteFactory: IHandlerFactory 
{ 
    public Handler CreateHandler(MyType type) => new ConcreteHandler(type); 
} 
+0

我認爲關鍵是'MyType'的實例會作爲第一個參數傳入。 – juharr

+0

@juharr,請參閱編輯。它解決了最初的問題(我首先回答了這個問題),在'MyType'中不必要地包裝了'IHandler'方法,並且爲每個處理方法移除了需要傳遞'MyType'的實例。 – Sinatr