3

想询问组合而不是继承在这里是否有意义,如果是这样的话,这是一个很好的方法。

我有一个这样的界面:

public interface IUser
{
  string FirstName {get; set}
  string LastName  {get; set}
}

还有一个“高级”用户界面,它具有与 IUser 相同的字段,但有一些附加功能。电话号码、电子邮件地址等

这个IAdvancedUser接口是否应该继承IUser并添加它自己的属性,或者在其中包含一个实例IUser,并使用 setter 注入来实例化该成员,是否也有意义?如果是后者,是否有一些 .Net/C# 习语在这些情况下运行良好——例如,通过包装或其他方法将IUser成员公开为成员?IAdvancedUser

这些是 DTO 对象,其中没有方法,只有属性。

4

1 回答 1

2

答案是:一定IAdvancedUser是一个IUser

在这种情况下:不,使用继承。

但是,“ composition over inheritance”不适用于接口,因为它们不遵循与类相同的规则。

例如,您可以这样做:

interface IAdvancedFeatures
interface IUser
interface IAdvancedUser : IUser, IAdvancedFeatures

通过这种方式,您可以启用任何东西来实现高级功能,而不是强迫它成为用户,而在其他情况下,每个人都必须是高级用户。

我通常尝试将接口视为定义功能而不是角色。所以你可以说你应该支持组合(比如 my IAdvancedUser),但与类(你在内部组合)不同。

于 2012-11-12T19:19:25.457 回答