关于我的评论,以下内容应该可以解决您的问题:
public class Visitor
{
public void doItterate(Cat c)
{
Console.WriteLine(c.ToString());
c.makeNoise();
c.climbTree();
}
public void doItterate(Dog d)
{
Console.WriteLine(d.ToString());
d.makeNoise();
}
}
public abstract class Pet
{
public Pet(string name, int age, Mood mood)
{
this.MoodOfPet = mood;
this.Name = name;
this.Age = age;
}
public string Name
{
get;
private set;
}
public int Age
{
get;
private set;
}
public Mood MoodOfPet
{
get;
private set;
}
public abstract void makeNoise();
public override string ToString()
{
return this.Name + " is " + this.Age +
" years old and feels " + this.MoodOfPet;
}
public abstract void accept(Visitor v);
}
public enum Mood
{
Surly,
Happy
}
public abstract class Dog : Pet
{
public Dog(string name, int age, Mood mood): base (name, age, mood)
{
}
public override void makeNoise()
{
Console.WriteLine(this.Name + " is woofing");
}
public override void accept(Visitor v)
{
v.doItterate(this);
}
}
public class SheepDog : Dog
{
public SheepDog(string name, int age, Mood mood): base (name, age, mood)
{
}
}
public class Cat : Pet
{
public Cat(string name, int age, Mood mood): base (name, age, mood)
{
}
public void climbTree()
{
Console.WriteLine(this.Name + " is climbing");
}
public override void makeNoise()
{
Console.WriteLine(this.Name + " is meowing");
}
public override void accept(Visitor v)
{
v.doItterate(this);
}
}
public class Terrier : Dog
{
public Terrier(string name, int age, Mood mood): base (name, age, mood)
{
}
public void growl()
{
Console.WriteLine(this.Name + " is growling");
}
public override void makeNoise()
{
growl();
}
}
public class MyPets
{
private Visitor visitor = new Visitor();
public MyPets()
{
Pets = new List<Pet>();
}
public List<Pet> Pets
{
get;
private set;
}
public void addPet(Pet p)
{
Pets.Add(p);
}
public void itterate()
{
foreach (Pet p in Pets)
{
p.accept(visitor);
}
}
}
Fiddle
这是使用抽象方法的标准 OOP 设计,稍后会在更具体的类中重载。
编辑现在它使用访问者模式
运行以下代码:
MyPets pets = new MyPets();
pets.addPet(new Cat("Bob", 2, Mood.Surly));
pets.addPet(new Terrier("Jack", 17, Mood.Surly));
pets.addPet(new SheepDog("Bubba", 2, Mood.Happy));
pets.itterate();
产生这些结果:
Bob 2 岁了,感觉很乖
鲍勃在喵喵叫
鲍勃正在攀爬
杰克今年 17 岁,感觉很乖
杰克在咆哮
布巴 2 岁了,感觉很开心
巴巴在发牢骚