以下界面内有一个Concert类型
public interface IHasCar{
long IdCar {get;set;}
Car car {get;set;}
}
我认为不应该,因为合同原因所以我试过了 改变这样的界面:
public interface IHasCar{
long IdCar {get;set;}
ICar car {get;set;}
}
然后具体的类Car将实现ICar和任何类 实现IHasCar可能是这样的:
public foo : IHasCar{
long IdCar {get;set;}
Car car {get;set;}
}
它将具有实现ICar的具体类Car,所以foo会 隐式实现IHasCar
不幸的是它不起作用,我需要一个来自混凝土类汽车的第二个属性,如果没有混凝土类汽车怎么办?
修改
我从朋友那里得到的一个建议就是写一个函数,从汽车中返回我想要的值,就像这样
public interface IHasCar{
long IdCar {get;set;}
long GetCarOwnerNumber(long IdCar) {get;set;}
}
这不如使用泛型,但它仍然可以接受吗?它是否会破坏接口原则或类似的东西?
答案 0 :(得分:4)
由于实现IHasCar的类不符合接口的合同,它不会编译,想一想,接口接受ICar,ICar可以是Car或其他任何东西,然后当你尝试设置一个ICar并不能保证它会成为一辆汽车,所以一切都会破裂。
如果您需要具体课程,您可以这样做:
public foo : IHasCar
{
long IdCar { get; set; }
ICar car { get{ return mainCar; } set{ if(value is Car)mainCar = (Car)value; } }
Car mainCar{ get; set; }
}
通过这种方式,您可以使用mainCar访问Car和car来完成界面。
答案 1 :(得分:2)
这是generics的用例之一。
如果IHasCar
有ICar
,但您需要在ICar
实施中访问IHasCar
个实施成员,那么在C#中表示如下:
public interface ICar
{
// ICar members
}
public interface IHasCar<TCar>
where TCar : class, ICar
// TCar must be a class and it must implement ICar
{
TCar Car { get; set; }
}
现在,让我们实现ICar
和IHasCar<TCar>
:
public class Car : ICar
{
}
public class Garage : IHasCar<Car>
{
public Car Car { get; set; }
public void DestroyCar()
{
// Now here your Garage implements IHasCar<Car>,
// so Car property is typed as Car instead of IHasCar<Car>
// and you'll be able to access Car members too!
}
}