Добавление к ответу Эвана:
Когда речь заходит о наследовании, уважая «является» (или «является своего рода») отношения - это не вся история.
Хороший дизайн также несет в себе LSP (принцип замены Лискова). Принцип гласит, что если B является подтипом A, то A можно заменить на B без каких-либо удивительных эффектов. Например, любой код, который работает с Vehicle
, также будет работать с Car
.
Классический пример, показывающий, как легко разбить этот принцип, является пример Square-Rectangle.
На первый взгляд кажется очевидным, что Square наследуется от Rectangle. Квадрат - это своего рода «Прямоугольник». Это прямоугольник, ширина и высота которого всегда одинаковы. Для того, чтобы сохранить это свойство, вы, вероятно, создать свой класс Square, как это:
public class Square : Rectangle
{
//SetWidth method inherited from Rectangle
public override void SetWidth(int width) {
base.width = width;
base.height = width;
}
}
Perfect. Но теперь, представьте следующий код:
public void SomeMethod(Rectangle rect) {
rect.SetHeight(10);
rect.SetWidth(20);
print(rect.GetHeight());
}
Этот код будет ожидать, что третья строка для печати 10, так как он просто установить высоту прямоугольника до 10. Однако, если заменить на площади, было бы напечатать 20 вместо этого, вызывая неожиданное поведение - и нарушая Принцип замещения Лискова. Таким образом, мы видим, что прямоугольник не всегда может быть заменен квадратом.
КМПА является одним из пяти принципов SOLID - я рекомендую прочитать больше о другой 4.
Если вы ищете хороший OO книгу, я должен сказать, что шаблоны Head First Design адские книгу, лучшее, что я когда-либо читал. Это немного связано с java, но только немного, они используют его для образцов кода и ничего больше. Предполагается, что он не зависит от языка, и вы можете прочитать его независимо от вашего программирования.
Большое спасибо за ваш время и этот отличный ответ. Не могли бы вы просто рассказать мне, какие еще 4 СОВЕТА, которые вы рекомендуете мне читать? – user3043746
@ user3043746 [S (Единая ответственность)] (http://www.oodesign.com/single-responsibility-principle.html) [O (Открыть Закрыть)] (http://www.oodesign.com/open-close -principle.html) [L (замена Лискова)] (http://www.oodesign.com/liskov-s-substitution-principle.html) [I (Сегрегирование интерфейса)] (http://www.oodesign.com /interface-segregation-principle.html) [D (инверсия зависимостей)] (http://www.oodesign.com/dependency-inversion-principle.html). Они необходимы для разработки гибкого и удобного в использовании приложения, а также большой трюк, который поможет вам во время интервью. – dcastro