Es scheint, als ob Sie Informationen falsch in Ihre Klassenhierarchie codieren. Es wäre sinnvoller, hier ein anderes Muster als Sub-Classing zu verwenden. Zum Beispiel, verwenden Sie nur eine Klasse (Besucher, oder vielleicht könnten Sie es potenziellen Teilnehmer nennen, was auch immer angemessen scheint) und kodieren Sie Informationen über die Dienste, die das Objekt abonniert ist, das dynamisch ändernde Verhalten hinter einem "Strategie" -Muster oder ähnlichem. Es gibt sehr wenig Details in Ihrem Beispiel, aber eine Sache, die Sie in C# tun könnten, ist eine "Abonnenten" -Eigenschaft zu machen, die das Verhalten des Objekts ändern würde, wenn der Status der Eigenschaft geändert würde.
Hier ist ein erfundenes etwas ähnliches Beispiel:
class Price
{
private int priceInCents;
private bool displayCents;
private Func<string> displayFunction;
public Price(int dollars, int cents)
{
priceInCents = dollars*100 + cents;
DisplayCents = true;
}
public bool DisplayCents
{
get { return displayCents; }
set
{
displayCents = value;
if (displayCents)
{
this.displayFunction =() => String.Format("{0}.{1}", priceInCents/100, priceInCents % 100);
}
else
{
this.displayFunction =() => (priceInCents/100).ToString();
}
}
}
public string ToString()
{
return this.displayFunction();
}
}
Sie können jedoch wahrscheinlich das "State" -Muster wie in der GoF beschrieben verwenden. aber Sie müssen den Typ der Klasse/des Objekts nicht ändern! – cruizer
sogar mit einer dynamischen Sprache ÄNDERUNG DER ART EINES OBJEKTS ist nicht immer möglich. – TomTom
Vielen Dank für das Vorschlagen des "State" -Musters ... Ich versuche hier zu tun ist, Unterklasse und Vererbung zu verwenden, so dass jedes Mal, wenn die Seite gerendert wird, eine geeignete abgeleitete Methode aufgerufen wird. Zum Beispiel, für Nicht-Abonnenten möchte ich den Link "Join Now" zeigen. während für Abonnenten ich den Link zu "Today's special" anzeigen möchte, und der Rest der Seite für alle Besucher gemeinsam sind. – Chris