Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Невзирая на тот факт, что каждый класс подключения имеет уникальное имя, определен в отдельном пространстве имен и (в некоторых случаях) упакован в отдельную сборку, все они реализуют общий интерфейс под названием
IDbConnection// Интерфейс IDbConnection определяет общий набор членов,// поддерживаемый всеми классами подключения.public interface IDbConnection : IDisposable{ // Методы IDbTransaction BeginTransaction(); IDbTransaction BeginTransaction(IsolationLevel il); void ChangeDatabase(string databaseName); void Close(); IDbCommand CreateCommand(); void Open(); // Свойства string ConnectionString { get; set;} int ConnectionTimeout { get; } string Database { get; } ConnectionState State { get; }}На заметку! По соглашению имена интерфейсов .NET снабжаются префиксом в виде заглавной буквы
IВ настоящий момент детали того, что делают члены интерфейса
IDbConnectionIDbConnectionOpen()Close()CreateCommand()IDbConnectionВ оставшихся главах книги вы встретите десятки интерфейсов, поставляемых в библиотеках базовых классов .NET Core. Вы увидите, что эти интерфейсы могут быть реализованы в собственных специальных классах и структурах для определения типов, которые тесно интегрированы с платформой. Вдобавок, как только вы оцените полезность интерфейсных типов, вы определенно найдете причины для построения собственных таких типов.
Сравнение интерфейсных типов и абстрактных базовых классов
Учитывая материалы главы 6, интерфейсный тип может выглядеть кое в чем похожим на абстрактный базовый класс. Вспомните, что когда класс помечен как абстрактный, он может определять любое количество абстрактных членов для предоставления полиморфного интерфейса всем производным типам. Однако даже если класс действительно определяет набор абстрактных членов, он также может определять любое количество конструкторов, полей данных, неабстрактных членов (с реализацией) и т.д. Интерфейсы (до C# 8.0) содержат только определения членов. Начиная с версии C# 8, интерфейсы способны содержать определения членов (вроде абстрактных членов), члены со стандартными реализациями (наподобие виртуальных членов) и статические члены. Есть только два реальных отличия: интерфейсы не могут иметь нестатические конструкторы, а класс может реализовывать множество интерфейсов. Второй аспект обсуждается следующим.
Полиморфный интерфейс, устанавливаемый абстрактным родительским классом, обладает одним серьезным ограничением: члены, определенные абстрактным родительским классом, поддерживаются только производными типами. Тем не менее, в крупных программных системах часто разрабатываются многочисленные иерархии классов, не имеющие общего родителя кроме
System.ObjectСиstomInterfacesnamespace CustomInterfaces{ public abstract class CloneableType { // Поддерживать этот "полиморфный интерфейс". // могут только производные типы. // Классы в других иерархиях не имеют доступа // к данному абстрактному члену public abstract object Clone(); }}При таком определении поддерживать метод
Clone()CloneableTypeMiniVanCarCloneableType// Недопустимо! Множественное наследование для классов в C# невозможноpublic class MiniVan : Car, CloneableType{}Несложно догадаться, что на помощь здесь приходят интерфейсные типы. После того как интерфейс определен, он может быть реализован любым классом либо структурой, в любой иерархии и внутри любого пространства имен или сборки (написанной на любом языке программирования .NET Core). Как видите, интерфейсы являются чрезвычайно полиморфными. Рассмотрим стандартный интерфейс .NET Core под названием
ICloneableSystemClone()public interface ICloneable{ object Clone();}Во время исследования библиотек базовых классов .NET Core вы обнаружите, что интерфейс
ICloneableSystem.ArraySystem.Data.SqlClient.SqlConnectionSystem.OperatingSystemSystem.StringSystem.ObjectICloneableProgram.csПохожие книги на "Язык программирования C#9 и платформа .NET5", Троелсен Эндрю
Троелсен Эндрю читать все книги автора по порядку
Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки mir-knigi.info.