gpt4 book ai didi

c# - 在 C# 中使用带有泛型的访问者模式

转载 作者:太空狗 更新时间:2023-10-29 18:30:38 26 4
gpt4 key购买 nike

我想知道以下访问者模式是否可以接受。从 Accept() 或 Visit() 调用返回时我感到有点不舒服 - 这是该模式的适当用法吗?如果不是,为什么不呢?

注意:对于长代码示例表示歉意,似乎有必要了解我正在做的事情,因为访问者似乎总是有点参与......

interface IAnimalElement<T>
{
T Accept(IAnimalVisitor<T> visitor);
}

interface IAnimalVisitor<T>
{
T Visit(Lion lion);
T Visit(Peacock peacock);
T VisitZoo(List<Animal> animals);
}

abstract class Animal
{
public int Age { get; protected set; }
}

class Lion : Animal, IAnimalElement<int>
{
public Lion(int age)
{
Age = age;
}

public int Accept(IAnimalVisitor<int> visitor)
{
return visitor.Visit(this);
}
}

class Peacock : Animal, IAnimalElement<int>
{
public Peacock(int age)
{
Age = age;
}

public int Accept(IAnimalVisitor<int> visitor)
{
return visitor.Visit(this);
}
}

class AnimalAgeVisitor : IAnimalVisitor<int>
{
public int TotalAge { get; private set; }

int IAnimalVisitor<int>.Visit(Lion lion)
{
TotalAge += lion.Age;
return lion.Age;
}

int IAnimalVisitor<int>.Visit(Peacock peacock)
{
TotalAge += peacock.Age + 10;
return peacock.Age + 10; // peacocks ages are always -10y, correct.
}

public int VisitZoo(List<Animal> animals)
{
// Calculate average animal age.

int sum = 0;
int count = 0;
foreach (IAnimalElement<int> animal in animals)
{
sum += animal.Accept(this);
++count;
}

return count == 0 ? 0 : sum / count;
}
}

class Program
{
static void Main(string[] args)
{
List<Animal> animals = new List<Animal>() { new Lion(10),
new Lion(15), new Peacock(3), new Lion(2), new Peacock(9) };

AnimalAgeVisitor visitor = new AnimalAgeVisitor();

Console.WriteLine("Average age = {0}, Total age = {1}",
visitor.VisitZoo(animals), visitor.TotalAge);
}
}

最佳答案

嗯,对我来说,这感觉就像实现有点悬而未决。

让您的 Visit 和 Accept 方法返回 void 并跟踪 Visitor 对象中的所有状态。最后审问它。

或者...

让 Visit 和 Accept 以功能方式返回进行中状态并接受传入的进行中状态。

如果您选择第二个选项,我不确定是否需要访问者对象或模式,您可以改用迭代器、函数和一些 transient 。

关于c# - 在 C# 中使用带有泛型的访问者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/508321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com