gpt4 book ai didi

c# - 这个设计使用动态好吗?

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

我有一份要在我的申请中处理的不同工作的列表。我正在尝试使用不同类型来表示不同类型工作的设计——这很自然,因为它们具有不同的属性等等。对于处理,我正在考虑按照下面的代码在 C# 中使用动态关键字。

abstract class Animal {}    
class Cat : Animal {}
class Dog : Animal {}

class AnimalProcessor
{
public void Process(Cat cat)
{
System.Diagnostics.Debug.WriteLine("Do Cat thing");
}

public void Process(Dog dog)
{
System.Diagnostics.Debug.WriteLine("Do Dog thing");
}

public void Process(Animal animal)
{
throw new NotSupportedException(String.Format("'{0}' is type '{1}' which isn't supported.",
animal,
animal.GetType()));
}
}

internal class Program
{
private static void Main(string[] args)
{
List<Animal> animals = new List<Animal>
{
new Cat(),
new Cat(),
new Dog(),
new Cat()
};

AnimalProcessor animalProcessor = new AnimalProcessor();
foreach (dynamic animal in animals)
{
animalProcessor.Process(animal);
}

//Do stuff all Animals need.
}
}

代码按预期工作,但是,我有一种挥之不去的感觉,我遗漏了一些非常明显的东西,并且有更好(或更广为人知)的模式来执行此操作。

有没有更好或同样好但更被接受的模式来处理我的动物?或者,这样好吗?并且,请解释为什么任何替代方案都更好。

最佳答案

您没有遗漏任何东西:根据对象的运行时类型进行调度是 dynamic 可以做得很好的事情。

您确实有其他选择,例如实现 visitor pattern ,但它在实现方面的成本要高得多,而且它的可读性也不如使用 dynamic 的方法:

interface IAnimalProcessor { // The visitor interface
void Process(Cat cat);
void Process(Dog dog);
void Process(Animal animal);
}
class AnimalProcessor : IAnimalProcessor {
...
}
interface IProcessable {
void Accept(IAnimalProcessor proc);
}
class Cat : IProcessable {
public void Accept(IAnimalProcessor proc) {
proc.Process(this); // Calls the Cat overload
}
}
class Dog : IProcessable {
public void Accept(IAnimalProcessor proc) {
proc.Process(this); // Calls the Dog overload
}
}
...
AnimalProcessor animalProcessor = new AnimalProcessor();
foreach (IProcessable animal in animals) {
animal.Accept(animalProcessor); // The animal will call back the right method of the proc
}

关于c# - 这个设计使用动态好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21843483/

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