关于重构为抽象类的基本问题

Exi*_*ist 6 c# inheritance abstract-class

这可能是一个初学者的问题,但是有一种标准方法可以将Wheel属性的重复重构为抽象类,但仍然保持对Part类型的显式强制转换.我们假设我们必须阻止将FastCarWheel放在SlowCar上,并且有许多属性就像这样.

abstract class Car {}

class FastCar : Car
{
    public FastCarWheel Wheel { get; set; }
} 

class SlowCar : Car
{
    public SlowCarWheel Wheel { get; set; }
} 

abstract class WheelPart {}

class FastCarWheel: WheelPart {}

class SlowCarWheel: WheelPart {}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,只允许这种类型的复制是常见的吗?我正在考虑使用泛型,但似乎我正在解决这个问题,并且每个额外的属性都会变得更糟.

abstract class Car <P>
    where P : Part
{
    protected abstract P Wheel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Win*_*ith 0

定义一个轮子接口(IWheel):

public interface IWheel
{
}
Run Code Online (Sandbox Code Playgroud)

实现 FastCarWheel 和 SlowCarWheel 的接口,例如

public class FastCarWheel : IWheel
{
}
Run Code Online (Sandbox Code Playgroud)

现在你的抽象类变成:

abstract class Car 
{
 public IWheel Wheel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后 Car 的子类可以自由使用他们选择的任何 Wheel 实现:

FastCar fastCar = new FastCar();
fastCar.Wheel = new FastCarWheel();
Run Code Online (Sandbox Code Playgroud)