2015-02-17 1 views
1

В следующем коде компилятор жалуется на то, что B не выполняет TestProperty абстрактного класса A. ITest2 происходит от ITest1, поэтому он реализует все, что есть ITest1 имеет. Почему это невозможно?Почему не может производный класс переопределять базовое свойство типа интерфейса типа с типом, который расширяет этот интерфейс?

public interface ITest1 { } 
public interface ITest2 : ITest1 { } 

public abstract class A 
{ 
    public abstract ITest1 TestProperty { get; set; } 
} 

public class B:A 
{ 
    public override ITest2 TestProperty { get; set; } 
} 
+0

Если вы собираетесь вниз голос так быстро, вы можете по крайней мере, уход объяснить? – PersyJack

+0

То, о чем вы просите, называется ковариацией. См. Http://stackoverflow.com/questions/5709034 и http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#Inheritance_in_object_oriented_languages ​​ –

ответ

8

Это будет не безопасно, так как вы могли бы сделать:

interface ITest3 : ITest1 { } 
public class Test3 : ITest3 { } 

A b = new B(); 
b.TestProperty = new Test3(); 

однако Test3 не реализует ITest2 в соответствии с требованиями B.

+0

Другими словами: каждая собака является животным, но не каждое животное собака. –

+0

О, я вижу, с вашим примером, теперь это имеет гораздо больше смысла. +1 для этого. – PersyJack

2

сделать класс родовое

Public abstract class A<TTest> 
    Where TTest : ITest1 
{ 
    Public abstract TTest TestProperty {get; set;} 
} 

Public class B : A<ITest2> 
{ 
.... 
} 
+0

Это то, что у меня было изначально, я хотел сделать класс неэквивалентным. – PersyJack

Смежные вопросы