2015-04-19 39 views
1

我想要interace A.哪種類型的對象可以生成類型A的其他對象。 我需要類型B的相同行爲。在我的應用程序中, B是也A.所以,我想B到從A.在覆蓋期間將返回類型更改爲派生類型

得出這是我的嘗試:

public interface A { 
    A method1(); 
} 
public interface B : A { 
    overrride B method1(); 
    void otherMethod(); 
} 

注意override關鍵字不到風度編譯這裏。使項目編譯的唯一方法是使界面B1如下所示:

public interface B : A { 
    //A method1(); /* commented out because it is inherired */ 
    void otherMethod(); 
} 

但是我想通過界面B1承諾,這種類型的對象有法生產型B.

的其他對象

接口B的實現可能看起來像:

class Foo : B { 
    B metod1(); 
} 

,我想B metod1()是的B method1() implemantation接口B,我也希望同樣的方法是實施A method1().我期望在實現接口B的所有類中都有相同的行爲。所以我不希望每次兩次爲兩個接口實現method1。

我在接口的c#中這樣做。但是我相信類似的問題甚至可能在類中也可能在Java中也很有趣。

回答

2

正確地做到這一點的唯一方法是使用泛型這樣的:

public interface A<T> where T : A<T> 
{ 
    T method1(); 
} 

然後B看起來是這樣的:

public interface B : A<B> 
{ 
    void otherMethod(); 
} 

而且最後,實現一個類將會是這樣的:

public class Bravo : B 
{ 
    public B method1() { return null; } 
    public void otherMethod() { } 
} 

但是,您可以使用new關鍵字在接口中隱藏某個方法,但這不是一個好主意,因爲這會導致您的代碼更難以推斷,因爲它會破壞正常繼承。

試試這個:

public interface A 
{ 
    A method1(); 
} 

public interface B : A 
{ 
    new B method1(); 
    void otherMethod(); 
} 

public class Bravo : B 
{ 
    A A.method1() { return null; } 
    public B method1() { return null; } 
    public void otherMethod() { } 
} 
+0

哇。這幾乎是我需要的。我可以讓B的例子表現得非常好。但是,我怎麼能聲明A型的變量,其中T是A 而不是它的後代?這個變量的類型是A >>嵌套無限多次。 –

+0

在首次編輯更多內容之前,我很喜歡原始答案。我知道新的關鍵字,這不是我所需要的。我想要實現一個接口的類僅實現一次method1! –

+0

對第一條評論抱歉。我用你的答案的前半部分。而對於我需要A而沒有任何後代的情況,我創建了非通用'公共接口A:A {}',現在一切都起到了奇蹟般的作用。 –

-1

這肯定是可能的,在這裏使用new關鍵字,而不是覆蓋,並顯式實現覆蓋的接口。

編輯: 根據您的意見調整樣本。你仍然需要明確的接口實現IFoo IFoo.GetData() { return GetData(); },但是這個本身沒有代碼,因爲它只是調用他隱含的實現public INewFoo GetData() { return new Foo(); }

下面是一個例子:

public interface IFoo 
{ 
    IFoo GetData(); 
} 

public interface INewFoo : IFoo 
{ 
    new INewFoo GetData(); 
} 

public class Foo : INewFoo 
{ 
    IFoo IFoo.GetData() { return GetData(); } 
    public INewFoo GetData() { return new Foo(); } 
} 
+0

我想一個方法impementing兩個接口。我編輯了這個問題來說明問題。 –