如何创建一个接口类型数组

时间:2017-03-10 17:26:56

标签: c#

我有一个由VehicleCar两个类实现的接口Truck。我如何创建一个包含所有不同类的混合的接口类型数组,并仍然能够访问其成员,并更改它们

public interface Vehicle
{
    double purchase_price();
    string vehicle_type();
    int release_year();
    int purchase_year();
    bool IsOld(int releaseYear, int purchaseYear);
    void Details();

}

在我的主要方法中,我有这个

  var vehls = new Vehicle[]
       {
           new Truck(8, 1000, "Ford", "F15000", 2011, 2016, false),
           new Truck(4, 13000, "Ford", "F-150", 2009, 2014, false),
           new Car("Ford", "Super Duty", 2012, 2017, false),
       };

当我试图访问汽车成员分配它们时,它不允许我。 它给了我错误。

   Car c1 = vehls[2];   
   c1.Wheel = 4;
   c1.Miles = 12000;

除非我投下它们:

   Car c1 = (Car) vehls[2];
   c1.Wheel = 4;
   c1.Miles = 12000;

我将如何创建这样的数组,以便我仍然可以访问每个类成员和字段,而无需填充构造函数中的所有内容。我不想一直在施展它。有没有办法让分配能够自动检测类类型并允许我访问和分配成员?

2 个答案:

答案 0 :(得分:8)

不,没有。

这是使用接口(或基本类)的整点,您只能通过接口访问派生类。如果您需要访问WheelMiles,那么这些成员应该是界面的一部分(作为属性)。

你正在做的向下倾斜是一种主要的代码嗅觉,虽然你总是总是避免它,但这是一个好的迹象,表明你做错了事。

答案 1 :(得分:1)

听起来更像是一个架构问题。根据Liskov Substitution Principle,无论你使用什么界面,你都应该像对待界面一样对待它,而不是试图将它转换为特定的类型。

如果您需要单独处理这些问题,请创建两个列表,然后将它们连接到接口列表。或者使用一些工厂模式或适配器模式等委托更好的方法来处理它。

Liskov Substition Principle的资源

Factory Pattern的资源