2010-06-15 42 views
2

對不起,有關奇怪的標題。我真的不知道如何表達它更好...不能從泛型基類和具有通用約束的相同類型的特定接口繼承

我在下面的代碼片段中遇到錯誤。我到處都使用Dummy類。編譯器是否理解我在DummyImplBase上添加的約束?如果我直接使用Dummy而不是將其設置爲約束,這是否是一個編譯器錯誤?

錯誤1'ConsoleApplication53.DummyImplBase'沒有實現接口成員'ConsoleApplication53.IRequired.RequiredMethod()'。 'ConsoleApplication53.RequiredBase.RequiredMethod()'不能實現'ConsoleApplication53.IRequired.RequiredMethod()',因爲它沒有匹配的'ConsoleApplication53.Dummy'返回類型。 C:\ Documents和Settings \泗門\我的文檔\ Visual Studio 2008的\項目\ ConsoleApplication53 \ ConsoleApplication53 \的Program.cs 37 27 ConsoleApplication53

public class Dummy 
{ 
} 

public interface IRequired<T> 
{ 
    T RequiredMethod(); 
} 

public interface IDummyRequired : IRequired<Dummy> 
{ 
    void OtherMethod(); 
} 

public class RequiredBase<T> : IRequired<T> 
{ 
    public T RequiredMethod() 
    { 
     return default(T); 
    } 
} 

public abstract class DummyImplBase<T> : RequiredBase<T>, IDummyRequired 
    where T: Dummy 
{ 
    public void OtherMethod() 
    { 
    } 
} 

回答

1

你可以將它添加到DummyImplBase:

public Dummy RequiredMethod() { return base.RequiredMethod(); } 

編輯:或者,如果您正在使用C#4.0中,你可以改變IRequired的定義,就像這樣:

public interface IRequired<out T> 

然後刪除IDummyRequired但你仍然可以派生類分配給 IRequired<Dummy>(而不是IDummyRequired)。

第二次編輯:你原來的代碼沒有編譯,因爲T可能是虛擬的或從虛擬派生的類。而實現的方法

public DummyDerived RequiredMethod() 

有不一樣的簽名

這是在IDummyDerived宣佈
public Dummy RequiredMethod() 

+0

這似乎更像是一個繁瑣的黑客隱藏原有的方法,仍然..這並沒有給我的泛型的優勢。然後,我必須在派生類中執行此操作,以獲得相同的結果。 – simendsjo 2010-06-15 10:11:50

+0

看到我的編輯,如果使用C#4.0是一個選項。 – Henrik 2010-06-15 10:37:47

+0

使用3.5仍然 – simendsjo 2010-06-15 10:44:03

0

我你改變DummyImplBase到:

public abstract class DummyImplBase<T> : RequiredBase<Dummy>, IDummyRequired 
     where T : Dummy 
{ 
    public void OtherMethod() 
    { 
    } 
} 
+0

但是,如果我使RequiredMethod虛擬並嘗試使用T或Dummy覆蓋它,此解決方案不起作用。 – simendsjo 2010-06-15 10:08:29

0

如果我做IDummyRequired通用它也可以,所以我想我必須改變我的一些設計才能做到這一點。我仍然希望找出爲什麼我的解決方案不起作用。

public class Dummy 
{ 
} 

public interface IRequired<T> 
{ 
    T RequiredMethod(); 
} 

public interface IDummyRequired<T> : IRequired<T> 
    where T : Dummy 
{ 
    void OtherMethod(); 
} 

public class RequiredBase<T> : IRequired<T> 
{ 
    public T RequiredMethod() 
    { 
     return default(T); 
    } 
} 

public abstract class DummyImplBase<T> : RequiredBase<T>, IDummyRequired<T> 
    where T: Dummy 
{ 
    public void OtherMethod() 
    { 
    } 
} 
+0

看到我的第二次編輯,爲什麼你的原代碼沒有編譯。 – Henrik 2010-06-15 11:28:45