Интерфейсы.ppt
- Количество слайдов: 14
Интерфейсы
Интерфейс представляет собой полностью абстрактный класс, все методы которого абстрактны. Методы интерфейса имеют модификаторы public и abstract, заданные по умолчанию. Интерфейс позволяет описывать некоторые свойства, которыми могут обладать объекты разных классов. public interface IProps{ void Prop 1(string s); void Prop 2 (string name, int val); } public class Clain : IProps { …}
Две стратегии реализации интерфейса Методы интерфейса должны быть обязательно реализованы в наследующем классе, иначе класс будет абстрактным. Два способа реализации: public n private n
рublic - реализация public class Clain: IProps{ public Clain() {} public void Prop 1(string s) { Console. Write. Line(s); } public void Prop 2(string name, int val) { Console. Write. Line("name = {0}, val ={1}", name, val); } }
рrivate - реализация public class Clain. P: IProps{ void IProps. Prop 1(string s) { Console. Write. Line(s); } void IProps. Prop 2(string name, int val) { Console. Write. Line("name = {0}, val ={1}", name, val); } n Обертывание - Создается открытый метод, являющийся оберткой закрытого метода. n Кастинг - Создается объект интерфейсного класса IProps, полученный преобразованием (кастингом) объекта исходного класса. public void My. Prop 1(string s){ ((IProps)this). Prop 1(s); } public void My. Prop 2(string s, int x){ ((IProps)this). Prop 2(s, x); } }
Вызов методов интерфейса public void Test. Clain. IProps(){ Console. Write. Line("Объект класса Clain вызывает открытые методы!"); Clain clain = new Clain(); clain. Prop 1(" свойство 1 объекта"); clain. Prop 2("Владимир", 44); Console. Write. Line("Объект класса IProps вызывает открытые методы!"); IProps ip = (IProps)clain; ip. Prop 1("интерфейс: свойство"); ip. Prop 2 ("интерфейс: свойство", 77); Console. Write. Line("Объект класса Clain. P вызывает открытые методы!"); Clain. P clainp = new Clain. P(); clainp. My. Prop 1(" свойство 1 объекта"); clainp. My. Prop 2("Владимир", 44); Console. Write. Line("Объект класса IProps вызывает закрытые методы!"); IProps ipp = (IProps)clainp; ipp. Prop 1("интерфейс: свойство"); ipp. Prop 2 ("интерфейс: свойство", 77); }
Проблемы множественного наследования n Коллизия имен Для разрешения возможны две стратегии склеивание методов и переименование. n Наследование от общего предка проблема дублирующего наследования сводится к проблеме коллизии имен.
public interface IProps. One { void Prop 1(string s); void Prop 2 (string name, int val); void Prop 3(); } public interface IProps. Two{ void Prop 1(string s); void Prop 2 (int val); void Prop 3(); }
public class Clain. M : IProps. One, IProps. Two { public void Prop 1 (string s) { Console. Write. Line(s); } public void Prop 2(string s, int x) { Console. Write. Line(s + "; " + x); } public void Prop 2 (int x) { Console. Write. Line(x); } // склеивание методов // перегрузка методов void IProps. One. Prop 3() { // переименование методов Console. Write. Line("Свойство 3 интерфейса 1"); } void IProps. Two. Prop 3() { Console. Write. Line("Свойство 3 интерфейса 2"); } public void Prop 3 From. Interface 1() { ((IProps. One)this). Prop 3(); } public void Prop 3 From. Interface 2() { ((IProps. Two)this). Prop 3(); } }
Наследование интерфейсов public interface IParent{ void Parent. Method(); } public interface ISon 1: IParent{ void Son 1 Method(); } public interface ISon 2: IParent{ void Son 2 Method(); } public class Pars: ISon 1, ISon 2{ public void Parent. Method() { Console. Write. Line("Это метод родителя!"); } public void Son 1 Method() { Console. Write. Line("Это метод первого сына!"); } public void Son 2 Method() { Console. Write. Line("Это метод второго сына!"); } }
Встроенные интерфейсы n IComparable public class Person : IComparable{ public int Compare. To( object pers) { const string s = "Сравниваемый объект не принадлежит классу Person"; Person p = pers as Person; // (P is T) ? (T)P : (T)null if (!p. Equals(null)) return (fam. Compare. To(p. fam)); throw new Argument. Exception (s); } // другие компоненты класса public static bool operator <(Person p 1, Person p 2){ return (p 1. Compare. To(p 2) < 0); } public static bool operator >(Person p 1, Person p 2){ return (p 1. Compare. To(p 2) > 0); } }
public void Test. Compare(){ Person poet 1 = new Person("Пушкин"); Person poet 2 = new Person("Лермонтов"); Person poet 3 = new Person("Пастернак"); Person poet 4 = new Person("Мандельштам"); Person poet 5 = new Person("Ахматова"); Person poet 6 = new Person("Цветаева"); Console. Write. Line("{0} > {1} = {2}", poet 1. Fam, poet 2. Fam, (poet 1 > poet 2)); Console. Write. Line("{0} >= {1} = {2}", poet 3. Fam, poet 4. Fam, (poet 3 >= poet 4)); Console. Write. Line("{0} != {1} = {2}", poet 5. Fam, poet 6. Fam, (poet 5 != poet 6)); }
Встроенные интерфейсы ICloneable Два типа клонирования: n поверхностное (shallow) n глубокое (deep) n public Person Standart. Clone(){ Person p = (Person)this. Memberwise. Clone(); return(p); } public void Test. Standart. Clone(){ Person mother = new Person("Петрова Анна"); Person daughter = new Person("Петрова Ольга"); Person = new Person("Петров Игорь"); mother[0] = daughter; mother[1] = son; Person mother_clone = mother. Standart. Clone(); Console. Write. Line("Дети клона: {0}", mother_clone. Fam); Console. Write. Line (mother_clone[0]. Fam); Console. Write. Line (mother_clone[1]. Fam); mother_clone[1]. Fam = "Петрова Вера"; Console. Write. Line(mother[1]. Fam); Console. Write. Line(mother_clone[1]. Fam); }
public object Clone(){ Person p = new Person(this. fam + "_clone"); //копирование полей p. age = this. age; p. count_child = this. count_child; for (int i = 0; i < this. count_child; i++) p. children[i] = new Person(this[i]. Fam); p. salary = this. salary; p. status = this. status; return (p); } Console. Write. Line("Дети клона_2: {0}", mother_clone 2. Fam); mother_clone 2[0]. Fam = "Петров Сергей"; Console. Write. Line(mother[0]. Fam); Console. Write. Line(mother_clone 2[0]. Fam);
Интерфейсы.ppt