我需要一个接口来接受concret类型而不是c#中的接口

时间:2016-08-30 20:41:32

标签: c# interface

以下界面内有一个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;}
}

这不如使用泛型,但它仍然可以接受吗?它是否会破坏接口原则或类似的东西?

2 个答案:

答案 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的用例之一。

如果IHasCarICar,但您需要在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; }
}

现在,让我们实现ICarIHasCar<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!
     }
}