我认为这是你应该使用继承的一个典型例子。以以下为例:
Abstract Class Item
{
// This class will never be instantiated, but it can hold
// things that are common to all Items, such as sale price.
private int price;
public int getPrice() { return price; }
// etc.
}
Class VendorOneItem : Item
{
// This class gets 'price' and 'getPrice' by default,
// since it inherits from Item
private String color;
private String model;
// etc.
}
Class VendorTwoItem : Item
{
// This class also gets 'price' and 'getPrice'
private Double width;
private Double height;
// etc.
}
我知道这并没有采取动态读取数据的路线,但这是我脑海中更清晰的方式。即使您能够以某种方式动态读取所有数据,如何处理这些数据?正如 Reed 所指出的,您可以拥有一个字典或某种地图,这是合理的。您的数据可能如下所示:
{"key": value}
{"Color": "blue"}
{"Price": 9.99}
{"Model": 1234-567-890}
或者
{"Price": 129.99}
{"Height": 12.750}
{"Width": 8.55}
但是,您只是将问题从在编译时找出属性转移到在运行时找出属性。为了处理这两个,您的代码的某些部分必须知道如何处理"Width"
and "Height"
,它还需要知道如何处理"Model"
and "Color"
。反射是一种可能性,但这些项目所描述的内容是根本不同的,并且可能几乎不可能概括处理它们的细节的算法。
对我来说,从基类开始并继承了解细节的类似乎要容易得多。您甚至可以Item
一路在代码中创建集合,而不必知道每个对象的确切类型。
在 C++ 中:
std::vector<*Item> items;
items.push_back(new VendorOneItem());
items.push_back(new VendorTwoItem());
现在假设您将其添加到Item
类中:
virtual public void ProcessItem()=0; //This will throw compilation errors
// if all derived classes don't define ProcessItem
所以现在,回到items
定义向量的地方,你可以这样做:
items[0].ProcessItem();
items[1].ProcessItem();
这两个对象是不同类的实例并没有什么区别。它们都必须实现 ProcessItem,因此确定要调用哪些函数没有问题。