Dies wäre ein guter Kandidat für das Besuchermuster.
Hier können Sie die folgende Basisklasse nehmen:
public abstract class Animal {
public abstract int Legs { get; }
public virtual void Speak() { Console.WriteLine("..."); }
public abstract void Accept(IAnimalVisitor visitor);
}
Hinweis das Verfahren übernehmen. Dies ist, wo die Magie mit unserem Besucherobjekt passieren wird.
Wir werden diese als unsere abgeleiteten Tiere implementieren, die wir verarbeiten müssen.
public class Cat : Animal {
public bool IsMewling { get; set; }
public override int Legs { get; } = 4;
public override void Accept(IAnimalVisitor visitor) { visitor.Visit(this); }
public override void Speak() { Console.WriteLine("Meow"); }
}
public class Dog : Animal {
public bool IsBarking { get; set; }
public override int Legs { get; } = 4;
public override void Accept(IAnimalVisitor visitor) { visitor.Visit(this); }
public override void Speak() { Console.WriteLine("Woof"); }
}
Okay, sehr gut. Ein paar Booleans mit unterschiedlichen Eigenschaftsnamen müssen wir vielleicht überprüfen. Lässt die IAnimalVisitor-Schnittstelle implementieren.
Und schließlich, erstellen wir eine Implementierung, die sehen, wenn das Tier zufällig spricht und sich je nach Zustand anders verhält.
public class LetsHearWhatItHasToSay : IAnimalVisitor {
public void Visit(Dog dog) {
if (dog.IsBarking) dog.Speak();
else Console.WriteLine("Good boy!");
}
public void Visit(Cat cat) {
if (cat.IsMewling) cat.Speak();
else Console.WriteLine("Pretty kitty");
}
}
Okay, großartig. Lassen Sie alles in einer kleinen Probe zusammenbinden.
void Main()
{
var animals = new List<Animal>
{
new Cat { IsMewling = true },
new Dog { IsBarking = false },
new Cat { IsMewling = false },
new Dog { IsBarking = true }
};
var visitor = new LetsHearWhatItHasToSay();
foreach (var animal in animals)
{
animal.Accept(visitor);
}
}
Und wir bekommen unsere erwarteten Ergebnisse
Meow
Good boy!
Pretty kitty
Woof
Die Vorteile Besucher in diesem Fall zu verwenden sind, dass wir eine beliebige Anzahl von gekapselten Objekten erstellen können, die verschiedenen Arten von logischen Operationen über die Klasse verarbeiten kann Hierarchie in einer typsicheren Weise, ohne Änderungen an dieser Klassenhierarchie vornehmen zu müssen. Der Nachteil ist, dass wenn Sie ein zusätzliches Tier hinzufügen, das Sie besuchen möchten, müssen Sie jeden Besucher aktualisieren, der in der Hierarchie arbeitet.
Klingt nach Hausaufgaben? – JonE
Spezifische Fragen zum Design sind für http://programmers.stackexchange.com besser geeignet, obwohl sie dies möglicherweise als auf Meinungen basieren sehen. –
@NexTerren Wenn Sie auf andere Websites verweisen, ist es oft hilfreich, darauf hinzuweisen, dass [Cross-Posting] verpönt ist. (Http://meta.stackexchange.com/tags/cross-posting/info) – gnat