M> ........
M>class C
M>{
M> SuitableForC * a;
M> void use() { /* никак не используем */ }
M>};
M> .........
M>
А если лениво описывать интерфейсы можно так:
class Generic_A
{
void foo() {/* код */}
void bar() {/* код */}
void car() {/* код */}
};
class SuitableForB: public Generic_A
{
//вообще может быть пустым.
}
class SuitableForС: public Generic_A
{
//вообще может быть пустым.
}
class Derived_A1 : public SuitableForB { ... };
class Derived_A2 : public SuitableForB, SuitableForC { ... }; //тут как-то хитро надо "ромбик" разводить, но это решаемо.class Derived_A3 : public SuitableForB, SuitableForC { ... };
class Derived_A4 : public Generic_A { ... };
class B
{
SuitableForB * a;
void use() { a->foo(); a->bar(); a->сar();}
};
class C
{
SuitableForC * a;
void use() { a->foo(); a->bar(); a->сar();}
};
За пример спасибо. Здесь все понятно! Как сам не догадался?! А вот насчет неразделения класса не понимаю, почему наследование в данном случае плохо и как тогда работать с единственным общим классом Материал.
Здравствуйте, dorofeevilya, Вы писали:
D>За пример спасибо. Здесь все понятно! Как сам не догадался?! А вот насчет неразделения класса не понимаю, почему наследование в данном случае плохо и как тогда работать с единственным общим классом Материал.
Ну это я "с высоты собственного опыта" говорю. То есть я полагаю, что в дальнейшем надобности в таком разделении не возникнет. Конечно, тебе виднее, ты домен знаешь лучше. Но скажи, какие методы будут в этих подклассах тогда? Я просто не представляю, что можно делать с Материалом кроме как копировать/сравнивать. Если это всего лишь хранилище специфичных данных, то ради этого не стоит жертвовать рантаймиовой настраимовостью. Лучше какой-нибудь проперти-мэп присобачить. 100% потом проще будет и манипулировать этим и на UI с этим работать.
Здравствуйте, dorofeevilya, Вы писали:
D>Насчет 7160000 соединений мне кажется, что это не отдельные классы, а экземпляры одного из двух классов (class ОргВещество и class НеоргВещество), также как и, допустим, бетоны марки B20 и B25 — два экземпляра class Бетон : Материал, а не два отдельных класса.
Видите ли, с точки зрения проектируемой программы нам не важно, какое это вещество — органическое или неорганическое. Нам важно другое — является ли это вещество материалом, из которого можно сделать конструкцию. И, очевидно, если ответ на последний вопрос "нет", то мы это вещество просто не рассматриваем.
Поэтому и имеем лишь один класс — Материал, а если быть точным, то — Материал для Конструкций.
D>А зачем тогда кодировать модель данных вообще, если все содержится в некой базе данных? Или я неправильно Вас понял?
И я не понимаю: "Зачем?" Если модель данных ничего не делает, то и не нужна такая модель. Мне кажется, что при проектировании правильнее ограничиваться минимальным количеством сущностей. Если у Вас класс не имеет каких-либо обязанностей, смело удалите его. Если несколько классов имеют одинаковые обязанности, то объедините их в один класс, а все лишние — выкините.
Т.е. пишите и оставляйте в программе только те классы, которые у Вас что-то делают.
Здравствуйте, Кирилл Лебедев, Вы писали:
КЛ>Здравствуйте, dorofeevilya, Вы писали:
D>>Насчет 7160000 соединений мне кажется, что это не отдельные классы, а экземпляры одного из двух классов (class ОргВещество и class НеоргВещество), также как и, допустим, бетоны марки B20 и B25 — два экземпляра class Бетон : Материал, а не два отдельных класса. КЛ>Видите ли, с точки зрения проектируемой программы нам не важно, какое это вещество — органическое или неорганическое. Нам важно другое — является ли это вещество материалом, из которого можно сделать конструкцию. И, очевидно, если ответ на последний вопрос "нет", то мы это вещество просто не рассматриваем.
КЛ>Поэтому и имеем лишь один класс — Материал, а если быть точным, то — Материал для Конструкций.
D>>А зачем тогда кодировать модель данных вообще, если все содержится в некой базе данных? Или я неправильно Вас понял? КЛ>И я не понимаю: "Зачем?" Если модель данных ничего не делает, то и не нужна такая модель. Мне кажется, что при проектировании правильнее ограничиваться минимальным количеством сущностей. Если у Вас класс не имеет каких-либо обязанностей, смело удалите его. Если несколько классов имеют одинаковые обязанности, то объедините их в один класс, а все лишние — выкините.
КЛ>Т.е. пишите и оставляйте в программе только те классы, которые у Вас что-то делают.
В принципе, я уже начинаю понимать о чем Вы говорите. Действительно, по сути производные классы материалов являются всего лишь хранилищами данных (физических характеристик) какого-либо типа материала. Но как выглядит реализация всего этого дела, я еще не могу понять. Может быть я не очень понятно задачу описал...
Здравствуйте, dorofeevilya, Вы писали:
D>В принципе, я уже начинаю понимать о чем Вы говорите. Действительно, по сути производные классы материалов являются всего лишь хранилищами данных (физических характеристик) какого-либо типа материала. Но как выглядит реализация всего этого дела, я еще не могу понять. Может быть я не очень понятно задачу описал...
В БД это будет:
Широченная таблица с колонками для хранения всех возможных параметров. Если нормальная СУБД и с данными планируется активно работать, то на этом лучше и остановиться
Все параметры хранятся в одном строковом атрибуте. Например в XML.
Разбить все возможные параметры материала на класса и выделить под их хранение отдельные таблицы (по таблице на каждый тип параметров) и плюс таблицы для связи всего этого барахла. (ИМХО выглядеть это будет красиво, но работать с этим будет неудобно)
А в коде тут вообще куча вариантов. Но в основе будет что-то типа map<Parameter, ParameterValue> .