为了账号安全,请及时绑定邮箱和手机立即绑定

Liskov替代原理-通用接口

Liskov替代原理-通用接口

C#
拉莫斯之舞 2021-05-07 14:15:07
我一直在尝试弄清楚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参数的方法,那么无论是用汽车还是摩托车来调用它都没关系。如果您需要铸造或以任何方式检查它是否是摩托车,则说明您的界面设计不正确。


查看完整回答
反对 回复 2021-05-15
  • 2 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信