如何在 C# 中组织抽象类层次结构

Dan*_*el 1 c# inheritance abstract-class multiple-inheritance

我在 C# 中遇到了一种情况,当我需要多重继承以避免在实现类中重复代码时,但这在 C# 中是被禁止的。

我应该怎么办?

我有以下接口:

public interface ICar
{
   void Move();
   void GetService();
}

public interface ISuperCar : ICar
{
   void MoveFast();
   void HaveARace();
}
Run Code Online (Sandbox Code Playgroud)

和抽象类:

public abstract class Car : ICar
{
   public void Move()
   {
      Console.WriteLine("Car moves");
   }

   public abstract void GetService();
}

public abstract class SuperCar : Car, ISuperCar
{
   public void MoveFast()
   {
      Console.WriteLine("SuperCar moves fastly");
   }

   public abstract void HaveARace();
}
Run Code Online (Sandbox Code Playgroud)

以及他们的实现:

public class ToyotaCar : Car
{
   public override void GetService()
   {
      Console.WriteLine("Getting ToyotaService");
   }
}

public class ToyotaSuperCar : SuperCar
{
   public override void GetService()
   {
      Console.WriteLine("Getting ToyotaService");
   }

   public override void HaveARace()
   {
      Console.WriteLine("Have a race in Toyota competition");
   }
}
Run Code Online (Sandbox Code Playgroud)

问题是如何不重复方法GetService()。从逻辑上讲应该是:

public class ToyotaSuperCar : SuperCar, ToyotaCar
{
   public override void HaveARace()
   {
      Console.WriteLine("Have a race in Toyota competition");
   }
}
Run Code Online (Sandbox Code Playgroud)

但是C#中不支持多重继承

Tho*_*ser 5

您可以使用组合而不是继承。让您的SuperCar类实现ICar而不是继承并在构造函数中Car传递一个对象,您将方法委托给该对象:ICar

public abstract class SuperCar : ICar, ISuperCar
{
    private readonly ICar car;

    public SuperCar(ICar car)
    {
        this.car = car;
    }

    public void Move() => car.Move();

    public void GetService() => car.GetService();

    public void MoveFast()
    {
        Console.WriteLine("SuperCar moves fastly");
    }

   public abstract void HaveARace();
}
Run Code Online (Sandbox Code Playgroud)

那么你的ToyotaSuperCar类将如下所示:

public class ToyotaSuperCar : SuperCar
{
    public ToyotaSuperCar(ToyotaCar car) : base(car) { }

    public override void HaveARace()
    {
       Console.WriteLine("Have a race in Toyota competition");
    }
}
Run Code Online (Sandbox Code Playgroud)