tags:

views:

61

answers:

2

I have a program that needs to be developed. For confidentiality, I will use vague terms. I have a widget which contains members shared by several different classes. My will handle a widget at 2 stages. each stage has different members but they do share some members as well. This is a diagram of the structure.

           Widget()
    |-                -|

SWidget() PWidget()

| -|

Stage1() Stage2()

Swidget and Pwidget inherit from Widget

Swidget contains 2 pwidgets

Stage1 and stage2 inherit from Swidget.

I have a class that will need to implement either a stage1 or stage2

If I declare the variable as a Swidget I can only see what is common. I cannot see what is specific to stage1 or stage2. How do I solve this problem? Inheritance works for everything but how they differ. please advise!

Edit that user posted as "answer":

Stage1 and Stage2 are almost completely the same. They differ with some members and some methods. The problem is that I cannot create properties in the base class to set properties in the specific subclasses. And the stage1/ stage2 class is instantiated before I know the values of their specific members. Thus I have no way of setting them if I declare a instance of the base class in the UI. The base class knows nothing of the subclasses. However, in order to have all properties and methods accessible from the UI, I will have to declare one of each and use the one I need.

+1  A: 

I believe what you are looking for is something like this:

class Stage
{
   //shared members
}

class Stage1: Stage
{
   //unique members
}

class Stage2: Stage
{
   //unique members
}

class SWidget: Widget
{
   Stage currentStage;
}

From what I can gather, you're experiencing the is-a or has-a dilemma. With the design above you can box Stage1 or Stage2 as currentStage. And then cast the property as needed to access the unique members.

Now whether this is the best way to do things is dependent on your specific needs.

Sorax
Note that in C++ you would want `Stage * currentStage;` or `shared_ptr<Stage> currentStage;` or some such declaration.
David Thornley
A: 

Stage1 and Stage2 are almost completely the same. They differ with some members and some methods. The problem is that I cannot create properties in the base class to set properties in the specific subclasses. And the stage1/ stage2 class is instantiated before I know the values of their specific members. Thus I have no way of setting them if I declare a instance of the base class in the UI. The base class knows nothing of the subclasses. However, in order to have all properties and methods accessible from the UI, I will have to declare one of each and use the one I need.

Tracy