【发布时间】:2012-05-30 13:11:21
【问题描述】:
我知道 C# 中不存在该功能,但 PHP 最近添加了一个名为 Traits 的功能,起初我认为这有点傻,直到我开始考虑它。
假设我有一个名为Client 的基类。 Client 有一个名为 Name 的属性。
现在我正在开发一个可供许多不同客户使用的可重复使用的应用程序。所有客户都同意客户应该有一个名称,因此它位于基类中。
现在客户 A 过来说他还需要跟踪客户的体重。客户 B 不需要体重,但他想跟踪身高。客户 C 想要同时跟踪体重和身高。
使用特征,我们可以同时创建 Weight 和 Height 特征特征:
class ClientA extends Client use TClientWeight
class ClientB extends Client use TClientHeight
class ClientC extends Client use TClientWeight, TClientHeight
现在我可以满足所有客户的需求,而无需在课堂上添加任何多余的内容。如果我的客户稍后回来说“哦,我真的很喜欢这个功能,我也可以拥有它吗?”,我只需更新类定义以包含额外的特征。
您将如何在 C# 中完成此操作?
接口在这里不起作用,因为我想要属性和任何关联方法的具体定义,并且我不想为每个版本的类重新实现它们。
(“客户”是指雇佣我作为开发人员的字面意义上的人,而“客户”指的是编程类;我的每个客户都有他们想要记录信息的客户)
【问题讨论】:
-
嗯,通过使用标记接口和扩展方法,您可以非常完美地模拟 C# 中的特征。
-
@Lucero 这些不是特征,并且缺乏添加新成员的能力(除其他外)。尽管如此,扩展方法还是很不错的。
-
@Lucero:这可以添加额外的方法,但是如果我想在客户端对象上存储额外的数据呢?
-
@Mark,那么你需要有一些能力在任意对象上动态存储数据,这不是运行时的特性。我会在这方面的回答中添加一些信息。
-
Traits 以 默认接口方法 的形式出现在 C# 中。请参阅 this proposal 和 the corresponding issue。 (我会发布一个答案,但我对它的了解还不够,无法发布任何有意义的内容。)
标签: c# design-patterns traits code-reuse default-interface-member