6_1_C#_интерфейсы.pptx
- Количество слайдов: 7
Тип интерфейс ü Интерфейс – именованный набор методов, не имеющих реализации. ü Определение интерфейса может содержать • методы (только сигнатуры) • свойства • индексаторы • события ü В классе, реализующем интерфейс, должны быть реализованы все методы интерфейса. ü Интерфейс описывает общую функциональность различных типов. public interface System. IDisposable { void Dispose(); } public interface System. IComparable { int Compare. To ( Object obj ); }
Определение интерфейса ü Имя интерфейса рекомендуется начитать с буквы I. ü Методы интерфейса не имеют модификаторов доступа. По умолчанию все методы интерфейса являются открытыми (public) и виртуальными (virtual). ü Интерфейс может быть унаследован от нескольких интерфейсов. public interface ICollection : IEnumerable { int Count {get; } bool Is. Synchronized {get; } object Sync. Root {get; } void Copy. To( Array array, int index ); } public interface IEnumerable { IEnumerator Get. Enumerator(); }
Реализация интерфейсов ü В типе, реализующем интерфейс, должны быть реализованы все методы интерфейса и все методы унаследованных интерфейсов. ü Методы интерфейса могут быть реализованы явно и неявно. • При неявной реализации в типе определяется метод с соответствующей сигнатурой без указаний на интерфейс. Этот метод виден как обычный метод типа. • При явной реализации в определении метода явно указывается имя интерфейса. Тип может содержать одновременно явную реализацию интерфейса и метод с тем же именем и сигнатурой. При помощи явной реализации можно реализовать два интерфейса с одинаковыми методами. interface IDemo { void F 1(); void F 2(); void F 3(); } class Bs : IDemo { public void F 1() { Console. Write. Line("Bs. F 1"); } void IDemo. F 1() { Console. Write. Line("IDemo. F 1 from Bs"); } public void F 2() { Console. Write. Line("Bs. F 2"); } void IDemo. F 3() { Console. Write. Line("IDemo. F 3 from Bs"); } } // явная реализация // неявная реализация // явная реализация
Реализация интерфейсов. Пример ü Класс, реализующий интерфейс, может наследовать реализацию методов интерфейса от своих базовых классов. interface IDemo { void F 1(); void F 2(); void F 3(); } static void Main(string[] args ) Bs bs 1 = new Bs(); Bs bs 2 = new Dr(); Dr dr = new Dr(); bs 1. F 1(); bs 2. F 1(); dr. F 1(); // bs 1. F 3(); interface INext. Demo { void F 1(); } class Bs : IDemo { public void F 1() { Console. Write. Line("Bs. F 1"); } void IDemo. F 1() { Console. Write. Line("IDemo. F 1 from Bs"); } public void F 2() { Console. Write. Line("Bs. F 2"); } void IDemo. F 3() { Console. Write. Line("IDemo. F 3 from Bs"); } } class Dr : Bs, IDemo, INext. Demo { void IDemo. F 1() { Console. Write. Line("IDemo. F 1 from Dr"); } void INext. Demo. F 1() { Console. Write. Line("INext. Demo. F 1 from Dr"); } } { // Bs. F 1 IDemo id 1 = bs 1; IDemo id 2 = bs 2; IDemo id 3 = dr; id 1. F 1(); id 2. F 1(); id 3. F 1(); id 2. F 2(); id 3. F 2(); // Bs. F 2 id 1. F 3(); id 2. F 3(); id 3. F 3(); } // IDemo. F 1 from Bs // IDemo. F 1 from Dr // IDemo. F 3 from Bs INext. Demo id 5 = bs 2 as Dr; id 5. F 1(); //INext. Demo. F 1 from Dr Console. Write. Line(id 5 == bs 2); // true
Интерфейс как параметр или как тип возвращаемого значения ü Возможно неявное преобразование класса к реализуемому им интерфейсу. ü Метод класса System. Collections. Array. List public virtual void Sort( IComparer comparer ); как значение параметра принимает ссылку на объект любого типа, который реализует интерфейс IComparer. public interface IComparer { int Compare( object x, object y ); }
Особенности реализации интерфейсов ü Если интерфейс реализован с помощью невиртуального метода, то при вызове через интерфейс будет вызван метод, соответствующий статическому типу в момент приведения к типу интерфейса. ü Даже если базовый класс реализовал интерфейс, то производный класс снова может реализовать интерфейс. public interface I { void f(); } public class A : I { public void f() { Console. Write. Line("A. f"); } } public class B : A, I { public new void f() { Console. Write. Line("B. f"); } } I i 1 = new I i 2 = new i 1. f(); // i 2. f(); // A(); B(); A. f B. f
Интерфейс IDisposable ü Классы, требующие явного освобождения ресурсов, могут предоставлять интерфейс IDisposable interface IDisposable { void Dispose(); } ü Оператор using - краткая форма try-finally class A : IDisposable { } class B : IDisposable { } using(a = new A()) using(b = new B()) { // … } a = new A(); try { b = new B(); try { … } finally { b. Dispose(); } } finally { a. Dispose(); }
6_1_C#_интерфейсы.pptx