2

假设我有一个 Item 类,它是复合模式的基类。

我有两个包含不同数据的特定子类 Movie 和 Music:

  • 电影:导演、制片人、演员名单……
  • 音乐:合唱团,唱片销量...

如果我想在客户端代码中访问电影数据(例如),我需要向下转换对应的 Item,因为 getProducer() 不是 Item 类的方法。

我被困在三种不同的方法之间:

  1. 将所有子类方法放到Item接口中
  2. 客户端代码中的向下转换项
  3. 使用从不同项目中提取数据的对象(使用一种访问者模式)

第三个命题似乎很有趣,因为它向客户端隐藏了 Item 子类,但我不知道如何让客户端更新 Item(例如更改电影的制片人)。

应用程序支持的 Item 子类类型将随着版本的发布而增长,我想对其进行设计以促进这些类型的添加。

也许我完全走错了路,有一个不同的更好的解决方案。

4

2 回答 2

0

选项 1 是个坏主意,因为 getProducer() 不属于某个项目。

如果除了您计划在那里实施的 getter 方法之外,您还证明了 setter 方法,选项 3 将起作用。

选项 2 对我来说听起来最合理。铸造是多态解决方案中的一项常见任务,在您的情况下它就足够了。

于 2013-08-23T10:13:21.720 回答
0

IMOMovieMusic对象是完全不同的,不应该从一个共同的基类派生。但是,如果您仍然想这样做,请修改Item类,如下所示(只是示例代码。请不要按原样使用此代码)

abstract class Item
{
    virtual object GetData(string sDataID);
}

现在,在派生类中,您可以重写此方法,如下所示。

class Movie: Item
{
    private Producer m_Producer = new Producer();
    override object GetData(string sDataID)
    {
        object ret = null;
        switch(sDataID)
        {
            case "Producer":
               ret = m_Producer;
               break;
        }           
    }

而且,在客户端代码中,您可以执行以下操作。

Item objItem = new Movie();
Producer objProducer = (Producer)objItem.GetData("Producer");

你明白了!

于 2013-08-23T07:20:12.017 回答