Как я сказал в главе 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).