我一直在尝试弄清楚Liskov替换原理和接口隔离原理,但我对以下示例有些困惑。假设我们有一个Vehicle带有几个属性的基类,以及一个IVehicle在IVehicle该类中实现的接口。我们有两个子类,Car&Motorcycle。Car从Vehicle继承并实现IVehicle接口。Motorcycle从Vehicle继承并也实现IVehicle,但是Motorcycle具有额外的属性,该属性也添加到了IMotorcycle在Motorcycle该类中实现的新Interface中。让我通过编写代码来澄清它:public interface IVehicle{ string Brand { get; set; } string Model { get; set; } int HorsePower { get; set; }}public interface IMotorcycle{ DateTime DateCreated { get; set; }}public abstract class Vehicle : IVehicle{ public string Brand { get; set; } public string Model { get; set; } public int HorsePower { get; set; }}public class Car : Vehicle, IVehicle{ }public class Motorcycle : Vehicle, IVehicle, IMotorcycle{ public DateTime DateCreated { get; set; }}public class Start{ public IVehicle DoSomeStuff() { //Does some stuff //Based on logic we either return //a new Car or Motorcycle //but if I return a motorcycle how would I be able to //access the DateCreated attribute since I'm returning IVehicle //I guess I have to cast it but is it a good practice to do that //or am I setting up everything incorrect? return new Motorcycle(); }}我的问题:如果我们说一个类,该类Start具有返回IVehicle(public IVehicle DoSomeStuff())的方法。根据逻辑,我们将返回newCar或Motorcycle。如果我们返回一个新值,Car因为它仅实现了IVehicle接口,我们将能够访问所有属性,但是假设我们返回一个新值,Motorcycle该方法将能够在.DateCreated不强制转换的情况下访问该属性,有没有一种方法可以更好地实现此目的,而不是拥有共同的接口,或者我错过了任何事情?
2 回答
慕神8447489
TA贡献1780条经验 获得超1个赞
如果要遵循LSP,如果您有接受IVehicle参数的方法,那么无论是用汽车还是摩托车来调用它都没关系。如果您需要铸造或以任何方式检查它是否是摩托车,则说明您的界面设计不正确。
- 2 回答
- 0 关注
- 144 浏览
添加回答
举报
0/150
提交
取消