Принципы объектно-ориентированного программирования

         

Наследование



Наследование

Как я сказал в главе 1, чтобы построить — в терминах данных или поведения — класс на основе другого класса, применяется наследование. Оно принадлежит к правилам заменяемости, а именно к тому, которое гласит, что производный класс может быть заменен базовым. Примером этого может служить написание иерархии классов базы данных. Допустим, вам был нужен класс для обработки баз данных Microsoft SQL Server и Oracle. Поскольку эти базы различны, вам понадобится по классу для каждой из БД. Однако в обеих БД достаточная доля общей функциональности, которую можно поместить в базовый класс, а два других класса сделать его производными, при необходимости подменяя или изменяя поведение, унаследованное от базового класса.

Чтобы унаследовать один класс от другого используется синтаксис:

class <производный_класс> : <базовый_класс> Вот пример того, на что может быть похож такой пример с базами данных:

using System;


class Database {

public Database()

{

CommonField = 42;

}

public int CommonField; public void CommonMethodO {

Console.WriteLine("Database.Common Method"); } }

class SQLServer : Database {

public void SomeMethodSpecificToSQLServerO

{

Console. WriteLineC' SQLServer. SomeMethodSpecific To SQLServer ");

> }

class Oracle : Database <

public void SomeMethodSpecificToOracleO

{

Console.WriteLine("Oracle.SomeMethodSpecificToOracle");

} }

class InheritanceApp {

public static void Main() {

SQLServer sqlserver = new SQLServerO;

sqlse rve r.SomeMethodSpeci ficToSQLServe r();

sqlserver. CommonMethodO;

Console.WriteLine("Inherited common field = {0}",

sqlserver.CommonField); } >

При компиляции и исполнении этого приложения получится следующий результат:

SQLSe rve r.SomeMethodSpecificToSQLServe r Database.Common Method Inherited common field =42

Заметьте: методы Database.CommonMethod и Database.CommonField теперь являются частью определения класса SQLServer. Так как классы SQLServer и Oracle происходят от базового класса Database, оба наследуют практически все его члены, определенные как public, protected, или internal. Единственное исключение — конструктор, который не может быть унаследован. У каждого класса должен быть реализован собственный конструктор, независимый от базового класса.

Подмена методов описана в главе 6. Однако замечу, что подмена методов позволяет изменять реализацию унаследованных от базового класса методов. Абстрактные классы интенсивно используют подмену методов (см. главу 6).



Содержание раздела