Поиск

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

Как я сказал в главе 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. Однако замечу, что подмена методов позволяет изменять реализацию унаследованных от базового класса методов. Абстрактные классы интенсивно используют подмену методов