2014-10-02 53 views
2

我無法讓我的測試使用泛型和多態。使用具有多態性的通用接口

這是我得到的錯誤,當我嘗試編譯:

類型「Testing.ChildBar」不能在泛型類型或方法可以作爲類型參數「T」「Testing.BaseFoo」 。沒有從'Testing.ChildBar'到'Testing.IBar'的隱式引用轉換。

類型「Testing.ChildBar」不能被用作在通用類型或方法「Testing.BaseFoo」類型參數「T」。沒有從'Testing.ChildBar'到'Testing.IFoo'的隱式引用轉換。

這裏是一個控制檯應用程序是我得到上述錯誤代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.ReadKey(); 
    } 
} 

public interface IFoo 
{ 
    Task<bool> Method1(); 
    Task<bool> Method2(); 
    Task<bool> Method3(); 
    Task<bool> Method4(); 
    Task<bool> Method5(); 
} 

public interface IBar<T> where T : BaseBar 
{ 
    T MyStuff { get; set; } 
} 

public abstract class BaseFoo<T> where T : BaseBar, IFoo, IBar<T> 
{ 
    public abstract T MyStuff { get; set; } 

    public abstract Task<bool> Method1(); 
    public abstract Task<bool> Method2(); 
    public abstract Task<bool> Method3(); 
    public abstract Task<bool> Method4(); 
    public abstract Task<bool> Method5(); 
} 

public abstract class BaseBar 
{ 
} 

public class ChildBar : BaseBar 
{ 
    public string TestMethod { get { return "Testing123"; } } 
} 

public class ChildFoo : BaseFoo<ChildBar> 
{ 
    private ChildBar _myStuff; 
    public override ChildBar MyStuff 
    { 
     get 
     { 
      if (_myStuff == null) 
      { 
       _myStuff = new ChildBar(); 
      } 
      return _myStuff; 
     } 
     set 
     { 
      _myStuff = value; 
     } 
    } 
    public override Task<bool> Method1() { return new Task<bool>(); } 
    public override Task<bool> Method2() { return new Task<bool>(); } 
    public override Task<bool> Method3() { return new Task<bool>(); } 
    public override Task<bool> Method4() { return new Task<bool>(); } 
    public override Task<bool> Method5() { return new Task<bool>(); } 

    private void Test() 
    { 
     var test = MyStuff.TestMethod; 
    } 
} 

我想做什麼就能做的是創造出許多不同的ChildFoo的,每個有「MyStuff」屬性,但是「MyStuff」屬性可以是我創建的從BaseBar繼承的任何類。

如果你能想到的一個更好的方式來做到這一點。我都是耳朵。

+2

該類結構*真*迷惑。你能提供一個更具體的例子說明你正在努力完成什麼? – BradleyDotNET 2014-10-02 22:35:10

回答

3

我希望能夠做的是創建許多不同的ChildFoo,每個都有一個「MyStuff」屬性,但是「MyStuff」屬性可以是我創建的任何繼承自BaseBar的類。

我認爲翻譯成這樣:

public abstract class BaseFoo<T> : IBar<T>, IFoo 
    where T : BaseBar 

由於IBar<T>定義MyStuff屬性,如果你想的BaseFoo孩子有一個屬性,你應該說BaseFoo延伸IBar<T>。您的原始代碼是說它的泛型參數(ChildBar)應該具有該屬性。

+0

非常感謝!那正是我需要的! – TRobinsonEXR 2014-10-02 22:51:46