2016-04-20 7 views
0

Ich bin verwirrt durch unterschiedliche Interaktionen zwischen Inheritationen und Abstraktionen. Lets sagen, dass ich eine bestimmte Klasse haben BaseClass genannt, jetzt auf dieser Basisklasse Ich habe mehrere inherrited abgeleiteten Klassen, InherritedBaseClassA etc ..Überschreibe eine [abstrakte Basisklasseneigenschaft] in einer [abstrakten Klasse] mit einer [abgeleiteten-von-Basisklasseneigenschaft] in einer inherrierten Klasse

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

Nun möchte Ich mag diese BaseClass als Eigenschaft in eine abstract Klasse hinzuzufügen:

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

und schließlich möchte ich in meiner Umsetzung dieser abstract Klasse, diese BaseClass mit Derived Klassen außer Kraft zu setzen.

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

Ich möchte, dies zu tun, weil an anderer Stelle in meinem Code ich eine generische Liste von AbstractBase haben und manchmal möchte ich AbstractBase.MyProperty.SomeGenericProperties acces, die unabhängig existieren, welche Art von inherrited Basisklasse Implementierung im seit ihrer Verwendung MyProperty von BaseClass inherrited ist

Antwort

1

Sie gehen zu müssen, C# Generics verwenden, um dieses Problem zu lösen.

Eine schnelle Implementierung würde wie folgt aussehen:

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. 
} 

Es ist wichtig, die where T: Baseclass zu beachten, dies den Compiler sagen, wird, dass der Typ immer angegeben werden Baseclass und Kompilierung erben tatsächlich fehlschlagen, wenn Sie versuchen, Verwenden Sie einen Typ, der dies nicht tut.

Auch here is some additional reading on generics.

0

Sie müssen Generika dafür verwenden.

Zum Beispiel:

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; } 
} 
Verwandte Themen