【问题标题】:C# Modelling with Inheritance使用继承的 C# 建模
【发布时间】:2018-03-29 12:09:59
【问题描述】:

我正在努力为我遇到的问题建模,为简单起见,我已将其转换为 Birds 示例:

假设我们有鸟,有些可以飞,有些不能,但是,它们都有翅膀,所有会飞的鸟的飞行方式完全相同。

我的问题是什么更适合飞行能力?通常,能力是使用接口来表示的,但这需要我在每个 Bird 中实现 Fly 方法,尽管它们以相同的方式飞行。

另一个问题是,一只鸟需要翅膀才能飞翔,什么可以代表“Need-A”关系?从 Bird 类的角度来看,这将是一个“Has-A”关系,但从代表飞行能力的模块来看,这将是一个“Need-A”关系。

这是我当前的类图。

为了解决上面的一些问题,我将Bird转换为CanFlyBird继承的抽象类。 这是正确的方法吗?

因为我似乎还需要弄清楚如何将鸟之翼类默认传递给飞行方法。

【问题讨论】:

  • 我也会将 CanFlyBird 类抽象化。
  • 你可以将fly方法作为虚拟方法,所以如果somone想覆盖它,该类可以覆盖else使用基本版本
  • @OnyxCaldin - 抽象类会产生问题,因为 fly 方法需要是抽象的,并且所有子类都必须强制实现它...最好将 fly 作为虚拟方法来解决问题想要覆盖它
  • @PranayRana 为什么 fly 方法需要是抽象的?我不明白。
  • @PranayRana 抽象类可以在其中完全实现虚拟方法。使它抽象的原因是你不能创建它的实例。

标签: c# oop interface abstract-class


【解决方案1】:

我有一个建议,你可以取出继承链的CanFlyBird输出,而不是通过构造函数传递它,意味着使用组合,

所以它会变成

Bird 被继承给 Eagle 和 Penguin ,您将 CanFlyBird 作为构造函数参数传递给 Eagle。

代码将是

interface IFly {
  void fly();
}

CanFlyBird 将是

   public class CanFlyBird : IFly {
     public void Fly() {}
   }

而鹰将是

  public class Eagle : Bird {
     private readonly IFly _fly;
     public Eagle (IFly fly) {
        _fly = fly; 
     }
 }

我的建议是使用组合而不是去贷款继承链。

通过这种方式,如果我想对 canFlyBird 类进行变体,我可以在不更改现有类的情况下创建它

所以会变成Bird has a flying capability


或者如果你想遵循当前的结构,那么

您可以在 CanFlyBird 类中将 fly 方法作为虚拟方法,因此如果有人想覆盖它,该类可以覆盖 else 使用基本版本

【讨论】:

  • @YahyaHussein - interface IFly { void fly(); }
  • 如果我去作曲,Eagle和CanFlyBird会是什么关系?
  • @YahyaHussein - 因为它的构造函数注入 Eagle 必须需要 CanFlyBird ......这意味着我认为它将是“有-A”关系
  • @YahyaHussein - 所以它会变成有飞行能力的鸟
【解决方案2】:

您在正确的轨道上,但我认为您的第二个问题基本上是,“我如何确保我不能建造一只没有翅膀的鸟”。

“Need-A”关系仍然是“Has-A”关系。您有两种方法来实现该要求。

首先,您可以在Bird 中为您的属性设置一个默认值:

Wing wings = new Wing(); //as a field or
public Wing Wings { get; set; } = new Wing() //as a property

或者第二个,在这种情况下可能更正确,在你的构造函数中需要一个翼:

public Bird(Wing wing) { this.wings = wing; }

至于“Fly()”我同意其他人并推荐一个虚拟方法。您可以稍后在您的子类中覆盖它,如果您决定有一天将游泳算作飞行,请允许您对 Penguin 子类进行最小的更改以实现您的更改。

【讨论】:

    猜你喜欢
    • 2011-11-05
    • 2011-04-17
    • 1970-01-01
    • 2023-03-06
    • 2011-03-27
    • 1970-01-01
    • 2014-06-09
    • 2018-05-23
    • 2012-10-05
    相关资源
    最近更新 更多