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#中不支持多重继承
您可以使用组合而不是继承。让您的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)