bearbeiten
Was Sie fordern, das heißt einen static
oder const
Wert in einer Unterklasse von einer Basisklasse Zugriff auf technisch möglich, aber die Prinzipien des guten SOLID OO Designs dabei verletzen. Da Sie eine Instanz einer bestimmten Unterklasse benötigen, um den Typ der Unterklasse "überdenken" zu können, um die entsprechende field1
zu erhalten, ist es wenig sinnvoll, dieses Problem statisch anzugehen.
Stattdessen ist der allgemeine, sauberere Ansatz hier subtype polymorphicism zu verwenden, der einer Aufrufmethode in der Basisklasse oder einer Methode in einer externen Klasse insgesamt den Zugriff auf den entsprechenden Wert für 'field1' basierend auf der Unterklasse ermöglicht . Dies ermöglicht, dass die Kontrolle über den zurückgegebenen Wert in den entsprechenden Unterklassen verbleibt (d. H. Gemäß Ihren Worten wird der Code nicht "fragmentiert").
Alternative Lösung unter Verwendung von Unterklasse polymorphicism (empfohlen)
Eine Unterklasse polymorpher Ansatz (dh mit dem virtual/abstract
und override
keywords) ermöglicht es Ihnen, das Abrufen eines Wertes (oder Objekt), die für jeden anpassbaren einzuzukapseln Unterklasse. Hier bleibt die Abstraktion konzeptionell bei "gebe mir einen ganzzahligen Wert", und dann können die unterklassenspezifischen Implementierungen von "wie", um den Wert zurückzugeben, vom Aufrufer abstrahiert (versteckt) werden. Wenn Sie die Basiseigenschaft als abstract
markieren, erzwingen Sie außerdem, dass alle Unterklassen die Eigenschaft implementieren, sodass die Anforderung, einen Wert anzugeben, nicht vergessen wird.
also würde ich einen polymorphen Ansatz wie folgt empfehlen:
public abstract class Foo
{
public abstract int Result { get; }
}
public class Bar : Foo
{
// This is implementation specific. Hide it.
private const int field1 = 5;
public override int Result
{
get { return field1; }
}
}
public class Baz : Foo
{
public override int Result
{
// No need for this implementation to be a constant ...
get { return TheResultOfAReallyComplexCalculationHere(); }
}
}
Wenn es keine anderen wieder verwendbaren konkreten Methoden auf der Basisklasse Foo
sind, dann könnten Sie auch die Abstraktion als Schnittstelle modellieren, mit der gleichen Wirkung :
public interface IFoo
{
int Result { get; }
}
dieses Problem ohne polymorphicism Annäherung an (nicht empfohlen)
All Kompilierung-Versuch benötigt in der Regel statische Felder auf Subklassen zugreifen Code wird irgendwo wechseln (oder Karte) auf die tatsächlich Art der Unterklasse-Instanz, zB:
public class Foo
{
public int result1
{
get
{
switch(this.GetType().Name)
{
case "Bar":
return Bar.field1;
case "Baz":
return Baz.field1;
default:
return 0;
}
}
}
public void MethodRequiringValueFromSubclass()
{
Console.WriteLine(result1);
}
}
public class Bar : Foo
{
public const int field1 = 5;
}
public class Baz : Foo
{
public const int field1 = 10;
}
Das Problem hierbei ist, dass die Open and Closed principal ist verletzt, da jedes Mal, wenn eine neue Unterklasse hinzugefügt wird, die result1
-Methode geändert werden muss, um die neue Klasse aufzunehmen.
Sie können eine virtuelle (oder bessere abstrakte) Funktion anstelle von statischen Mitglied hinzufügen, die den Wert in Kindklasse zurückgibt ... – Khan
Ja gibt es wirklich keine Möglichkeit, um so etwas wie ein virtuelles Mitglied (Getter/Get-Methode) - die Typ System erlaubt diese statische Vererbung, die Sie suchen – mfeineis
Statische und Vererbung nicht gut zusammen spielen. Wenn Sie versuchen, sie zusammen spielen zu lassen, werden Sie mit einem der beiden enden, die den anderen verprügeln. – apokryfos