2014-10-01 4 views
1
abstract class db{ 
    // return an handle to db 
} 

class type extends db{ 
    // code that uses db 
} 

abstract class limits extends db{ 
    // code that DOES NOT use db 
} 

class otherclass extends limits{ 
    // code that use db and limits 
} 

Как вы можете видеть, мне нужно db во всех классах, кроме ограничений. Но лимиты являются родительскими для классов, которые используют db. Я думаю, что это неправильный шаблон дизайна, так как я расширяю db в пределах, чтобы иметь доступ к db для детей. Или это? Спасибо.Предложение предложения ООП для наследования

+0

Это единственная причина для ограничений класса exsists? В этом случае: избавиться от этого класса –

+0

No Vincent. класс ограничений выполняет другие задания, необходимые детям. – Paolo

+2

Почему он расширяет 'db', если он не« использует »его - и, безусловно, использование указывает compose not inherit. Почему ограничение требует базового класса/интерфейса? – doctorlove

ответ

5

В зависимости от неустановленных требований вам будет лучше с составом вместо наследования, в данном случае.

class db { 
    // returns db handle 
} 

class type { 
    private db; // type can now use db 
} 

class limits { 
    // does something 
} 

class otherclass { 
    private limits; 
    private db;  // can use limits and db 
} 
+2

+1. В основном потому, что четыре класса без какого-либо наследования между ними просто прекрасны :-) Подклассификация - это самый переоцененный/чрезмерно используемый аспект ООП. – Thilo

+0

Кажется, вы совершенно правы md4. Я действительно новичок в ООП. Я попробую ваше предложение. – Paolo

1

Вы сказали: «Мне нужно db во всех классах, кроме ограничений». который указывает, что вы должны составить (или содержать) db, не наследуемый от него. См. Ответ md4.

Вам нужно подумать о том, почему у вас могут быть абстрактные классы - это обычно потому, что вы хотите «запрограммировать интерфейс», чтобы сфотографировать фразу.

Возможно db и limits две разных вещи - думать единую ответственность ...

abstract class db { 
    // returns db handle 
} 

abstract class limits { 
    // does something 
} 

class otherclass : extends limits, db { 
} 

... редактировать начало ...
Очевидно, что для некоторых конкретных языков ОО как Java и C# limits и db должно быть interface s, а не классами. ОП не указывал язык.
... редактировать конец ...

Подумайте о том, с помощью кода - рассмотреть написание нескольких модульных тестов, чтобы увидеть, как он выглядит. Подумайте о том, что должно измениться вместе и что должно быть развязано.

+0

Я предпочитаю ваш ответ. Это дает OP больше обдумывать. – md4

+0

Сказав это, ваш 'otherclass', кажется, пытается использовать множественное наследование, а не то, что мне известно, поддерживаемое Java (что я предполагаю использовать OP). – md4

+0

True - но не было языкового тега ... Я задаю «интерфейс» «абстрактный класс» в C++, но потом я не говорю «extends» – doctorlove

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