【问题标题】:Composition over inheritance in this case?在这种情况下,组合优于继承?
【发布时间】:2012-11-01 05:51:52
【问题描述】:

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

我有一个这样的界面:

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

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

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

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

【问题讨论】:

    标签: c# inheritance composition


    【解决方案1】:

    答案是:IAdvancedUser 必须始终是IUser

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

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

    例如,您可以这样做:

    interface IAdvancedFeatures
    interface IUser
    interface IAdvancedUser : IUser, IAdvancedFeatures
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多