2013-05-23 2 views
0

Я хочу получить советы по дизайну классов. Предположим, что у меня есть 3 класса, "class A", "class B" and "class C". Каждый класс имеет разные пространства имен. "A" has an instance of "B", and "B" has an instance of "C". Каждый класс имеет «struct Setting», и каждый класс задается с помощью SetSettings(). Фактически, "A" uses "B" to do its job, and "B" uses "C" to do its job.Зависимости классов иерархии

Мой вопрос в том, есть ли лучший способ сделать эти настройки иерархии?

Например, to break the relation between "A" and "C", "B" может иметь те же параметры "C::Settings" вместо того, чтобы определять c_settings ...

Спасибо заранее!

хиджры

#include "B.h" 
namespace A { 
struct Settings { 
    int param_for_A_1; 
    B::Settings b_settings; 
}; 
class A { 
    void SetSettings(const Settings& source) { 
    settings_ = source; 
    b_.SetSettings(source.b_settings); 
    } 
    Settings settings_; 
    B::B b_; 
}; 
} 

B.h

#include "C.h" 
namespace B { 
struct Settings { 
    int param_for_B_1; 
    int param_for_A_2; 
    C::Settings c_settings; 
}; 
class B { 
    void SetSettings(const Settings& source) { 
    settings_ = source; 
    c_.SetSettings(source.c_settings); 
    } 
    Settings settings_; 
    C::C c_; 
}; 
} 

C.h

namespace C { 
struct Settings { 
    int param_for_C_1; 
}; 
class C { 
    void SetSettings(const Settings& source) { 
    settings_ = source; 
    } 
    Settings settings_; 
}; 
}  

main.c С.

#include "A.h" 
int main() { 
    A::Settings settings; 
    // Hierarchy settings... 
    settings.param_for_A_1 = 1; 
    settings.b_settings.param_for_B_1= 2; 
    settings.b_settings.param_for_B_2 = 3; 
    settings.b_settings.c_settings.param_for_C_1= 4; 
    class A::A a; 
    a_.SetSettings(settings); 
    return; 
} 
+0

1) зависит от того, насколько виден вы хотите иметь c-класс в своем приложении. 2) Я почему-то не получаю вашу причину для использования этой strcut для связывания int с этими классами :( – Najzero

+0

Спасибо за ваш комментарий Najzero. 1) В этом примере иерархия не так глубока в моем фактическом проекте, иерархия глубже, и я хотел чтобы скрыть более низкие уровни. 2) На самом деле в зависимости от класса есть несколько параметров. – carlos

ответ

0

В настоящее время, вы не на самом деле с помощью наследования, а состав. Композиция означает, что класс имеет атрибут типа другого класса, а не наследует функции и атрибуты родительского класса.

Если бы я хотел использовать наследование, я, вероятно, использовал бы класс C в качестве базы, из которой B наследовал бы. A затем наследует от B. Каждое «поколение» имеет свой собственный атрибут int, соответствующий их «настройкам».

В зависимости от ситуации это может быть более подходящим.

+0

Спасибо Мацзар. Мне очень жаль отсутствие информации, но «A», «B» и «C» являются «has-a», а не «is-a», поэтому композиция для меня была лучше. – carlos

+0

Ну, у меня больше нечего сказать. : P Без контекста сложно улучшить код. Например, я не сразу вижу, как использование 'C :: Settings c_settings' в структуре для' B' И имеет экземпляр класса 'C' в качестве атрибута, единственным атрибутом которого является' c_settings'. Я также довольно новичок в программировании (<1 год), поэтому извините за то, что вы не очень помогли. Надеюсь, ты найдешь свой ответ. – Matzar

+0

Отношение между этими классами: «A» использует «B» для выполнения своей работы, а «B» использует «C» для выполнения своей работы. Спасибо, в любом случае! – carlos

Смежные вопросы