Обратите также внимание на то, что в класс TwoDShape
по-прежнему входит метод ShowDim()
и что он не объявляется с модификатором abstract. В абстрактные классы вполне допускается (и часто практикуется) включать конкретные методы, которые могут быть использованы в своем исходном виде в производном классе. А переопределению в производных классах подлежат только те методы, которые объявлены как abstract
.
Предотвращение наследования с помощью ключевого слова sealed
Несмотря на всю эффективность и полезность наследования, иногда возникает потребность предотвратить его. Допустим, что имеется класс, инкапсулирующий последовательность инициализации некоторого специального оборудования, например медицинского монитора. В этом случае требуется, чтобы пользователи данного класса не могли изменять порядок инициализации монитора, чтобы исключить его неправильную настройку. Но независимо от конкретных причин в C# имеется возможность предотвратить наследование класса с помощью ключевого слова sealed
.
Для того чтобы предотвратить наследование класса, достаточно указать ключевое слово sealed
перед определением класса. Как и следовало ожидать, класс не допускается объявлять одновременно как abstract
и sealed
, поскольку сам абстрактный класс реализован не полностью и опирается в этом отношении на свои производные классы, обеспечивающие полную реализацию.
Ниже приведен пример объявления класса типа sealed
.
sealed class А {
// . . .
}
// Следующий класс недопустим.
class В : A { // ОШИБКА! Наследовать класс А нельзя
}
Как следует из комментариев в приведенном выше фрагменте кода, класс В не может наследовать класс А, потому что последний объявлен как sealed
.
И еще одно замечание: ключевое слово sealed
может быть также использовано в виртуальных методах для предотвращения их дальнейшего переопределения. Допустим, что имеется базовый класс В и производный класс D. Метод, объявленный в классе В как virtual
, может быть объявлен в классе D как sealed
. Благодаря этому в любом классе, наследующем от класса % предотвращается переопределение данного метода. Подобная ситуация демонстрируется в приведенном ниже фрагменте кода:
class В {
public virtual void MyMethodO { /* ... */ }
}
class D : В {
// Здесь герметизируется метод MyMethodO и
// предотвращается его дальнейшее переопределение,
sealed public override void MyMethodO { /* ... */ }
}
class X : D {
// Ошибка! Метод MyMethodO герметизирован!
public override void MyMethodO { /* ••• */ }
}
Метод MyMethod()
герметизирован в классе D, и поэтому не может быть переопределен в классе X.
Класс object
В C# предусмотрен специальный класс object
, который неявно считается базовым классом для всех остальных классов и типов, включая и типы значений. Иными словами, все остальные типы являются производными от object
. Это, в частности, означает, что переменная ссылочного типа object
может ссылаться на объект любого другого типа. Кроме того, переменная типа object
может ссылаться на любой массив, поскольку в C# массивы реализуются как объекты. Формально имя object
считается в C# еще одним обозначением класса System.Object
, входящего в библиотеку классов для среды .NET Framework.
В классе object
определяются методы, приведенные в табл. 11.1. Это означает, что они доступны для каждого объекта.
Некоторые из этих методов требуют дополнительных пояснений. По умолчанию метод Equals(object)
определяет, ссылается ли вызывающий объект на тот же самый объект, что и объект, указываемый в качества аргумента этого метода, т.е. он определяет, являются ли обе ссылки одинаковыми. Метод Equals(object)
возвращает логическое значение true
, если сравниваемые объекты одинаковы, в противном случае — логическое значение false
. Он может быть также переопределен в создаваемых классах. Это позволяет выяснить, что же означает равенство объектов для создаваемого класса. Например, метод Equals(object)
можно определить таким образом, чтобы в нем сравнивалось содержимое двух объектов.
Таблица 11.1 Методы класса object
Метод
Назначение
public virtual bool
Определяет, является ли вызывающий объект таким же,
Equals(object
как и объект, доступный по ссылке оb