5

好的,在面向对象语言 (OOL) 中,当创建一个类时,我们通常会提前知道它的所有属性。例如,项目类应该有一个固定的属性(颜色、型号、品牌、价格)。所以我们只是:

   public Class Item{
     private String color;
     private String model;
     //etc more attribute here

     //& set & get method for all attributes
     public String getColor() {
         return color;
     }

     public void setColor(String color) {
        this.color = color;
     }

     public String getModel() {
         return model;
     }

     public void setModel(String model) {
         this.model = model;
     }
    }

但是如果所有属性都是动态的呢?例如,在 1 家公司,他们的商品属性可能是颜色、品牌,但在另一家公司,他们没有颜色和品牌属性,但有宽度、高度、尺寸......

如何在 Java、C++ 或任何 OOL 中创建一个接受动态属性的类?

4

3 回答 3

4

如何在 Java、C++ 或任何 OOL 中创建一个接受动态属性的类?

这真的取决于你想如何使用它。在许多情况下,您可以修改您的类以包含某种类型的动态增长的集合,例如std::mapC++ 中的 a 或 Java 中的Map(or Dictionary)。

这允许您使用在运行时选择的键为每个实例创建和添加任意数据。

于 2013-08-13T17:03:09.603 回答
0

我认为这是你应该使用继承的一个典型例子。以以下为例:

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,因此确定要调用哪些函数没有问题。

于 2013-08-13T19:53:54.630 回答
0

。网

我将首先分析您的需求,这不是您经常看到的。也许您的课程设置不正确。

一个选项可能是存储在字典中

在新版本的 .NET 中,它们具有动态关键字,可以帮助创建像 ViewBag 这样的动态属性。

您还可以将反射与Reflection EmitICustomTypeDescriptor一起使用。

于 2013-08-13T17:45:47.400 回答