2014-10-02 3 views
2

제네릭 및 다형성에 대한 테스트를 수행하는 데 문제가 있습니다.다형성이있는 일반 인터페이스 사용

유형 'Testing.ChildBar'가 'Testing.BaseFoo'제네릭 형식 또는 메서드의 형식 매개 변수 'T'로 사용할 수 없습니다 : 내가 컴파일 할 때 여기

내가 점점 오전 오류입니다 . '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

답변

3

내가 할 수 있기를 원하는 것은 각각 "MyStuff"속성이있는 많은 다른 ChildFoo를 만드는 것이지만 "MyStuff"속성은 BaseBar에서 상속하는 모든 클래스가 될 수 있습니다.

는 그이로 변환 생각 : 당신이 그 속성을 가지고 BaseFoo의 자녀를 원하는 경우 IBar<T> 이후

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

MyStuff 속성을 정의, 당신은 BaseFooIBar<T>를 확장한다는되어야한다. 원래 코드는 일반적인 인수 (ChildBar)가 해당 속성을 가져야한다고 말합니다.

+0

정말 고마워요! 그것이 내가 필요한 것입니다! – TRobinsonEXR