我有一个由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 c1 = vehls[2];
c1.Wheel = 4;
c1.Miles = 12000;
除非我投下它们:
Car c1 = (Car) vehls[2];
c1.Wheel = 4;
c1.Miles = 12000;
我将如何创建这样的数组,以便我仍然可以访问每个类成员和字段,而无需填充构造函数中的所有内容。我不想一直在施展它。有没有办法让分配能够自动检测类类型并允许我访问和分配成员?
答案 0 :(得分:8)
不,没有。
这是使用接口(或基本类)的整点,您只能通过接口访问派生类。如果您需要访问Wheel
和Miles
,那么这些成员应该是界面的一部分(作为属性)。
你正在做的向下倾斜是一种主要的代码嗅觉,虽然你总是总是避免它,但这是一个好的迹象,表明你做错了事。
答案 1 :(得分:1)
听起来更像是一个架构问题。根据Liskov Substitution Principle,无论你使用什么界面,你都应该像对待界面一样对待它,而不是试图将它转换为特定的类型。
如果您需要单独处理这些问题,请创建两个列表,然后将它们连接到接口列表。或者使用一些工厂模式或适配器模式等委托更好的方法来处理它。