2013-10-23 36 views
-1

我知道這聽起來微不足道,但是當我將一個A變量傳遞給一個需要IMyIntercace的函數時,它有可能返回b字段嗎?然後我不必在類A中實現Hello()函數,而只需將b作爲IMyInterface返回即可。我可以實現一個接口並在返回時將其作爲字段使用嗎?

interface IMyInterface 
{ 
    void Hello(); 
} 
class A : IMyInterface 
{ 
    B b = new B(); 
} 
class B : IMyInterface 
{ 
    public void Hello() 
    { 
     Console.WriteLine("Hello"); 
    } 
} 
class Program 
{ 
    static void foo(IMyInterface myInterface) 
    { 
     myInterface.Hello(); 
    } 
    static void Main(string[] args) 
    { 
     A someVariable = new A(); 
     foo(someVariable); 
    } 
} 

我想它不能做,但有沒有任何設計模式或技巧可以做到這一點?

編輯

的原因,我不想得到一個是因爲也許我想這樣做

class A : IMyInterface 
{ 
    B b = new B(); 
    B b2 = new B(); 
    IMyInterface bPointer; 
} 

然後我可以指向根據一些情況,B的一個

+1

爲什麼你有這樣的需求?設計將取決於你想達到什麼目的? –

+0

爲什麼不'A類:B'? –

回答

0

您可以從B繼承A。 A將繼續實現該接口,您可能會覆蓋將來需要更改的每個函數。

interface IMyInterface 
{ 
    void Hello(); 
} 
class A : B 
{ 

} 
class B : IMyInterface 
{ 
    public void Hello() 
    { 
     Console.WriteLine("Hello"); 
    } 
} 
0

號要麼A實現IMyInterface,在這種情況下,你不需要做任何事情,要麼沒有,在這種情況下,沒有辦法自動「重定向」任何有興趣的各方b成員。

您可以暴露b(最好是使它成爲一個屬性)到外面的世界,讓他們可以稱其爲需要,也可以使A實現IMyInterface並手動將所有呼叫轉b這樣的:

class A : IMyInterface 
{ 
    B b = new B(); 

    public void Hello() 
    { 
     b.Hello(); 
    } 
} 
0

只需將A.b公開(或內部),然後致電foo(someVariable.b)

0

你想要的是接口委派,不幸的是沒有任何內容可以幫助你。

基本上,A類必須實現接口。它可以做到這一點

一種方法當然是從B推導:

class A : B 
{ 
} 

但是,如果你不想這樣做,那麼你需要委派。你需要做的是自己實現委派,這樣你就可以將實際實現的責任委託給B類,你不會從編譯器得到任何幫助來解決這個問題。

class A : IMyInterface 
{ 
    B b = new B(); 

    public void Hello() 
    { 
     b.Hello(); 
    } 
} 
+2

繼承不應該被認爲是解決「機械」問題的方法。要麼A在擴展B的領域模型中有意義,要麼沒有。 – Jon

相關問題