带继承的C#建模

带继承的C#建模,c#,oop,interface,abstract-class,C#,Oop,Interface,Abstract Class,我正在努力建模我遇到的一个问题,为了简单起见,我将其转换为Birds示例: 让我们假设我们有鸟,有些能飞,有些不能,然而,它们都有翅膀,所有的飞鸟都以完全相同的方式飞行 我的问题是什么更适合飞行能力?通常,能力是用接口表示的,但这需要我在每只鸟内部实现Fly方法,尽管它们的飞行方式相同 另一个问题是,一只鸟需要翅膀才能飞翔,什么能代表一种“需要-一种”关系?从鸟类的角度来看,这将是一种“Has-a”关系,但从代表飞行能力的模块来看,这将是一种“Need-a”关系 这是我当前的类图 为了解决上面

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

让我们假设我们有鸟,有些能飞,有些不能,然而,它们都有翅膀,所有的飞鸟都以完全相同的方式飞行

我的问题是什么更适合飞行能力?通常,能力是用接口表示的,但这需要我在每只鸟内部实现Fly方法,尽管它们的飞行方式相同

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

这是我当前的类图

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

因为我似乎仍然需要弄清楚,默认情况下如何将Bird类的Wings传递给Fly方法


你的思路是对的,但我认为你的第二个问题基本上是,“我如何确保我不能建造一只无翼鸟”

“需要A”关系仍然是“有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()”,我同意其他人的看法,并推荐一种虚拟方法。您可以在以后的子类中重写此项,如果有一天您决定将游泳计算为飞行,则允许您对企鹅子类进行最小的更改以实现您的更改

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

因此,它将成为

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

代码将是

interface IFly {
  void fly();
}
  public class Eagle : Bird {
     private readonly IFly _fly;
     public Eagle (IFly fly) {
        _fly = fly; 
     }
 }
坎弗伯德也会

   public class CanFlyBird : IFly {
     public void Fly() {}
   }
老鹰也会

interface IFly {
  void fly();
}
  public class Eagle : Bird {
     private readonly IFly _fly;
     public Eagle (IFly fly) {
        _fly = fly; 
     }
 }
我的建议是利用组合,而不是贷款继承链

通过这种方式,如果我想对
canFlyBird
类进行修改,我可以创建它,而无需更改现有的类

因此,它将成为具有飞行能力的鸟


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


你可以在CanFlyBird类中将fly方法作为虚拟方法,因此如果有人想重写它,该类可以重写其他使用基本版本的类

我也会将CanFlyBird类抽象化。你可以将fly方法作为虚拟方法,因此如果有人想重写它,该类可以重写其他使用基的类version@OnyxCaldin-abstrac类创建问题,因为fly方法需要是抽象的,并且所有子类都必须强制实现它…最好将fly作为虚拟方法,以解决如果有人想要重写的问题it@PranayRana为什么fly方法需要抽象?我不明白。@PranayRana抽象类可以在其中完全实现虚拟方法。将其抽象化的原因是您无法创建它的实例。@YahyaHussein-
接口IFly{void fly();}
如果我使用合成,鹰和坎弗利伯德之间的关系是什么?@YahyaHussein-因为鹰需要坎弗利伯德…意味着它将是一种“has-A”关系think@YahyaHussein-所以它会变成一只有飞行能力的鸟