每隔一段时间,我就会遇到一种情况,我希望所有类都具有相似的逻辑。例如,也许我想要一个 Bird
和一个 Airplane
能够Fly()
.如果您正在考虑“策略模式”,我会同意,但即使使用策略,有时也无法避免重复代码。
例如,假设以下适用(这与我最近遇到的真实情况非常相似):
Bird
和 Airplane
需要持有一个实现 IFlyBehavior
的对象的实例. Bird
和 Airplane
需要问的IFlyBehavior
实例到 Fly()
当OnReadyToFly()
叫做。 Bird
和 Airplane
需要问的IFlyBehavior
实例到 Land()
当OnReadyToLand()
叫做。 OnReadyToFly()
和 OnReadyToLand()
是私有(private)的。 Bird
继承Animal
和 Airplane
继承PeopleMover
. 现在,假设我们稍后添加
Moth
, HotAirBalloon
和其他 16 个对象,假设它们都遵循相同的模式。我们现在需要以下代码的 20 个副本:
private IFlyBehavior _flyBehavior;
private void OnReadyToFly()
{
_flyBehavior.Fly();
}
private void OnReadyToLand()
{
_flyBehavior.Land();
}
我不喜欢这个的两件事:
BankRight()
至 IFlyBehavior
,我们需要将更改传播到所有 20 个类。 ICrashable
,所以抽象基类并不总是一个可行的解决方案)。 如果...?
如果 C# 有一个新的结构会怎样,比如
pattern
或 template
或者[在这里填写你的想法],它像一个接口(interface)一样工作,但允许你在成员上放置私有(private)或 protected 访问修饰符?您仍然需要为每个类提供一个实现,但是如果您的类实现了 PFlyable
模式,你至少有办法强制每个类都有必要的样板代码来调用 Fly()
和 Land()
.而且,借助像 Visual Studio 这样的现代 IDE,您将能够使用“实现模式”命令自动生成代码。就我个人而言,我认为扩展接口(interface)的含义以涵盖任何契约(Contract)更有意义,无论是内部(私有(private)/ protected )还是外部(公共(public)),但我建议首先添加一个全新的结构,因为人们似乎非常固执关于“接口(interface)”这个词的含义,我不希望语义成为人们回答的焦点。
问题:
不管你怎么称呼它,我想知道我在这里建议的功能是否有意义。我们是否需要某种方法来处理由于需要限制性访问修饰符或由于程序员无法控制的原因而无法抽象出尽可能多的代码的情况?
更新
根据 AakashM 的评论,我相信我请求的功能已经有了一个名称:Mixin。所以,我想我的问题可以缩短为:“C# 应该允许 Mixins 吗?”
最佳答案
您描述的问题可以使用访问者模式解决(一切都可以使用访问者模式解决,所以要小心!)
访问者模式允许您将实现逻辑移至新类。这样你就不需要基类,访问者在不同的继承树上工作得非常好。
总结:
如需引用,请参阅 Visitor pattern
关于C# 有抽象类和接口(interface),它也应该有 "mixins"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2310388/