2016-04-20 3 views
0

Я смущен различными взаимодействиями наследования/абстракции. Допустим, у меня есть определенный класс, называемый BaseClass, теперь на этом BaseClass у меня есть несколько inherrited производных классов, InherritedBaseClassA и т.д ..Переопределить [абстрактное свойство baseclass] в [абстрактном классе] с [производным от baseclass-property] в унаследованном классе

class BaseClass 
{ 
    int SomeGenericProperties {get; set;}  
} 
class InherritedBaseClassA : BaseClass 
{ 
    int PropertyOnlyInA {get; set;} 
} 
class InherritedBaseClassB : BaseClass 
{ 
    int PropertyOnlyInB {get; set;} 
} 

Теперь я хотел бы добавить BaseClass как свойство в abstract класс:

abstract class AbstractBase 
{ 
    public abstract Baseclass MyProperty {get;set;} 
} 

и, наконец, я хотел бы, в моей реализации этого abstract класса, переопределить BaseClass с Derived классов.

class Implementation_A_OfAbstractBase : AbstractBase 
{ 
    // how do i write this line? 
    public override InherritedBaseClassA MyProperty; 
} 

Я хочу, чтобы это сделать, потому что в другом месте в моем коде у меня есть общий список AbstractBase и иногда я хочу Acces AbstractBase.MyProperty.SomeGenericProperties, которые не существуют независимо от того, какой inherrited им реализации BaseClass с использованием, так как их MyProperty является inherrited от BaseClass

ответ

1

Вы собираетесь должны использовать C# Generics, чтобы решить эту проблему.

Быстрая реализация будет выглядеть следующим образом:

abstract class AbstractBase<T> where T: Baseclass 
{ 
    public abstract T MyProperty { get; set;} 
} 

class Implementation_A_OfAbstractBase : AbstractBase<InherritedBaseClassA>   
{ 
    //you no longer need to override the property, the generic type takes care of this for you. 
} 

Важно отметить where T: Baseclass это будет сказать компилятору, что тип указанного всегда будет наследовать Baseclass и составление фактически потерпеть неудачу, если вы пытаетесь используйте тип, который этого не делает.

Также here is some additional reading on generics.

0

Для этого вам нужно использовать дженерики.

Например:

abstract class AbstractBase<T> 
    where T : BaseClass 
{ 
    public abstract T MyProperty { get; set; } 
} 

abstract class AbstractBase : AbstractBase<BaseClass> 
{ 
} 

class Implementation_A_OfAbstractBase : AbstractBase<InherritedBaseClassA> 
{ 
    public override InherritedBaseClassA MyProperty { get; set; } 
} 
Смежные вопросы