假设我有一个Item类,它是复合模式的基类。
我有两个特定的子类Movie和Music包含不同的数据:
如果我想在客户端代码中访问Movie数据(例如),我需要向下转换与之对应的Item,因为getProducer()不是Item类的方法。
我陷入了三种不同的方法之中:
第三个命题似乎很有趣,因为它将Item子类隐藏到客户端,但我不知道如何让客户端更新Item(例如更改电影的制作者)。
应用程序支持的Item子类型将通过发行版增长,我想设计它以方便这些类型的添加。
也许我完全走错了方向,并且有一个不同的更好的解决方案。
答案 0 :(得分:0)
IMO,Movie
和Music
对象完全不同,不应从公共基类派生。但是,如果您仍想这样做,请修改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");
你明白了!
答案 1 :(得分:0)
选项1是个坏主意,因为getProducer()不属于某个项目。
如果除了计划在那里实施的getter方法之外你还要证明了setter,那么选项3也会有效。
选项2对我来说听起来最合理。在多态解决方案中,转换是一项常见任务,在您的情况下,它就足够了。