继承还是构成?

时间:2010-09-30 19:17:17

标签: inheritance

我有一个需要开发的程序。为了保密,我会使用模糊的术语。我有一个小部件,其中包含由几个不同类共享的成员。我会在两个阶段处理一个小部件。每个阶段都有不同的成员,但他们也分享了一些成员。这是结构图。

           Widget()
    |-                -|

SWidget()PWidget()

| - |

Stage1()Stage2()

Swidget和Pwidget继承自Widget

Swidget包含2个pwidgets

Stage1和stage2继承自Swidget。

我有一个类需要实现stage1或stage2

如果我将变量声明为Swidget,我只能看到常见的东西。我看不出stage1或stage2的具体内容。我该如何解决这个问题?继承适用于所有内容,但它们的区别如何。请指教!

修改用户发布为“回答”:

Stage1和Stage2几乎完全相同。它们与一些成员和一些方法不同。问题是我不能在基类中创建属性来设置特定子类中的属性。 stage1 / stage2类在我知道其特定成员的值之前被实例化。因此,如果我在UI中声明基类的实例,我无法设置它们。基类对子类一无所知。但是,为了能够从UI访问所有属性和方法,我将必须声明其中一个并使用我需要的那个。

2 个答案:

答案 0 :(得分:1)

我相信你要找的是这样的:

class Stage
{
   //shared members
}

class Stage1: Stage
{
   //unique members
}

class Stage2: Stage
{
   //unique members
}

class SWidget: Widget
{
   Stage currentStage;
}

从我可以收集的信息来看,你遇到了is-a or has-a困境。通过上面的设计,您可以将Stage1或Stage2设置为currentStage。然后根据需要转换属性以访问唯一成员。

现在,这是否是最好的做事方式取决于您的具体需求。

答案 1 :(得分:0)

Stage1和Stage2几乎完全相同。它们与一些成员和一些方法不同。问题是我不能在基类中创建属性来设置特定子类中的属性。 stage1 / stage2类在我知道其特定成员的值之前被实例化。因此,如果我在UI中声明基类的实例,我无法设置它们。基类对子类一无所知。但是,为了能够从UI访问所有属性和方法,我将必须声明其中一个并使用我需要的那个。