2010-09-30 67 views
-2

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

  Widget() 
    |-    -| 

SWidget()PWidget()

| - |

阶段1()阶段2()

Swidget和Pwidget从窗口小部件

Swidget继承包含2个pwidgets

stage1和stage2从Swidget继承。

我有一个类,需要实现两种stage1或stage2的

如果我宣布变量作为Swidget我只能看到什么是常见的。我看不到stage1或stage2特有的内容。我该如何解决这个问题?继承对一切都有效,但它们的区别。请指教!

编辑用户张贴的 “答案”:

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

+2

您的格式需要修正。如果这是作业,请将其标记为有作业。 “为了保密,我会用模糊的术语”通常意味着这是作业。 – 2010-09-30 19:19:07

+0

作文在哪里?更不用说:Stage1和Stage1在他们所做的事情上有多相似,特别是他们将从外部调用的方法?你的班级如何知道是否实施Stage1或Stage2,并且它是否做了不同的事情?你在看什么语言? – 2010-09-30 20:21:49

+1

由于现在还没有足够的信息来回答这个问题,我正在投票结束。 – 2010-09-30 20:56:17

回答

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

请注意,在C++中,您需要'Stage * currentStage;'或'shared_ptr currentStage;'或其他声明。 – 2010-09-30 20:22:57

0

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