【问题标题】:C# multilevel inheritance or duplicated implementation of interfaces?C# 多级继承还是接口的重复实现?
【发布时间】:2020-11-26 21:28:59
【问题描述】:

从技术上讲,多级继承的数量似乎没有限制。示例:D 类继承 C 类,C 类继承 B 类,B 类继承 A 类。但是,随着您继续继承,它们的名称开始变得复杂。

在我看来,事实上,拥有一个基类并使用接口会是一种更好的方法。

我遇到的问题是,对于接口,我必须在每个类中实现属性。使用基类,我只在一个地方实现它们。

在我的场景中,我有以下内容:

  • 基类:Animal
  • 接口:RankeableByLevel(它具有允许对动物进行排名的附加属性)、FilterableByExpertise(它具有允许过滤动物的附加属性)。

有 10-15 个Animal 子类,大约 7-8 个可以排序和/或过滤。我不想在 7-8 个类中的每一个中实现接口(我认为“重复”太多)。

一种选择是创建一个名为AnimalRankeableByLevel 的基类和另一个AnimalRankeableByLevelAndFilterableByExpertise,特别是最后一个似乎太长了!

对于接口,我不得不过多地“重复”实现。 继承太多类,看起来会出错(名字太长,继承太多)。

解决办法是什么?

谢谢!

【问题讨论】:

  • 将重复的实现包装到一个类中,并将接口调用委托给它。
  • @Lennart 谢谢,您能否提供一个示例,包括您如何命名(如果有命名约定)实现接口属性的类?
  • 您可能还感兴趣,从 C# 8 开始,您可以为接口提供默认实现
  • 这被称为“多级继承”,而不是“嵌套基类”。嵌套类是在另一个类内部声明的类(通常在包含类之外不可见)

标签: c# class inheritance interface


【解决方案1】:

优先组合而不是继承。在 7-8 个类中实现接口本身不是问题。

如果您想减少接口实现的重复(因为例如某些值的计算是相似的),您可以将该计算提取到另一个类并将接口实现委托给该类。

例子:

public class SomeAnimal : IRankable
{
  private IRankingCalculator calculator = new RankingCalculator();

  public int Rank => calculator.GetRank();

  //...
}

public interface IRankable
{
   public int Rank {get;}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 2011-10-07
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2014-12-31
    相关资源
    最近更新 更多