Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建接口类型数组_C# - Fatal编程技术网

C# 如何创建接口类型数组

C# 如何创建接口类型数组,c#,C#,我有一个接口Vehicle,由两类Car和Truck实现。如何创建包含所有不同类的混合的接口类型数组,并且仍然能够访问它们的成员并对其进行更改 public interface Vehicle { double purchase_price(); string vehicle_type(); int release_year(); int purchase_year(); bool IsOld(int releaseYear, int purchaseYe

我有一个接口
Vehicle
,由两类
Car
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成员以分配他们时,它不允许我。 这给了我错误

   Car c1 = vehls[2];   
   c1.Wheel = 4;
   c1.Miles = 12000;
除非我投下他们:

   Car c1 = (Car) vehls[2];
   c1.Wheel = 4;
   c1.Miles = 12000;
我如何才能创建这样一个数组,这样我仍然能够访问每个类成员和字段,而不必填充构造函数中的所有内容。我不想一直在演。有没有一种方法可以让分配自动检测类类型并允许我访问和分配成员?

没有

这就是使用接口(或基类)的全部要点,即您只能通过接口访问派生类。如果需要访问
Wheel
Miles
,则这些成员应该是接口的一部分(作为属性)


您正在做的向下投射是一种主要的代码气味,虽然您不能总是避免它,但这是一个好迹象,表明您正在以错误的方式进行操作。

听起来您更像是遇到了架构问题。根据Liskov替换原则,无论您在哪里使用自己的接口,都应该将其视为一个接口,而不是试图将其降级为特定类型

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

资源


卡车的资源也有车轮和里程数。你为什么要打破利斯科夫替代法Principle@johnny5你可能想要一个链接,我怀疑OP知道这是什么,我强烈建议您学习和遵循.NET命名约定-并考虑使用属性而不是方法。这是什么解决方案,我的意思是好的设计将是什么?@ EHSASASAJAD我不知道您的整个域模型,所以很难说。正如一位评论员指出的,卡车也有车轮和里程数,所以对于这个确切的代码,我只想将这两个属性添加到interfaceThanks中,以供您的评论。因此,基本上所有方法都在接口中,在每个接口中实现它们时,不需要为它们创建属性class@SeekAddo对没有。所有公共方法/属性(基本上)都属于接口。实现类仍然需要这些属性才能符合接口。@BradleyDotNET是的,我在接口中添加了所有里程、车轮和制造商,并在类中实现了它们。但我的观点是,所有的方法都来自接口,每个类都没有更多的定义。这对接口来说正常吗?@SeekAddo NP,这些模式对设计总是很有帮助的