Интерфейсы
Интерфейс представляет собой полностью абстрактный класс, все методы которого абстрактны. Методы интерфейса имеют модификаторы public и abstract, заданные по умолчанию. public interface IProps{ void Prop1(string s); void Prop2 (string name, int val); }
Две стратегии реализации интерфейса Методы интерфейса должны быть обязательно реализованы в наследующем классе, иначе класс будет абстрактным. Два способа реализации: public private
рublic - реализация public class Clain:IProps{ public Clain() {} public void Prop1(string s) { Console.WriteLine(s); } public void Prop2(string name, int val) { Console.WriteLine("name = {0}, val ={1}", name, val); }
рrivate - реализация public class ClainP:IProps{ public ClainP(){ } void IProps.Prop1(string s) { Console.WriteLine(s); } void IProps.Prop2(string name, int val) { Console.WriteLine("name = {0}, val ={1}", name, val); } Обертывание Кастинг public void MyProp1(string s){ ((IProps)this).Prop1(s); } public void MyProp2(string s, int x){ ((IProps)this).Prop2(s, x); }
Вызов методов интерфейса public void TestClainIProps(){ Console.WriteLine("Объект класса Clain вызывает открытые методы!"); Clain clain = new Clain(); clain.Prop1(" свойство 1 объекта"); clain.Prop2("Владимир", 44); Console.WriteLine("Объект класса IProps вызывает открытые методы!"); IProps ip = (IProps)clain; ip.Prop1("интерфейс: свойство"); ip.Prop2 ("интерфейс: свойство",77); Console.WriteLine("Объект класса ClainP вызывает открытые методы!"); ClainP clainp = new ClainP(); clainp.MyProp1(" свойство 1 объекта"); clainp.MyProp2("Владимир", 44); Console.WriteLine("Объект класса IProps вызывает закрытые методы!"); IProps ipp = (IProps)clainp; ipp.Prop1("интерфейс: свойство"); ipp.Prop2 ("интерфейс: свойство",77); }
Проблемы множественного наследования Коллизия имен Для разрешения возможны две стратегии - склеивание методов и переименование. Наследование от общего предка проблема дублирующего наследования сводится к проблеме коллизии имен.
public interface IProps{ void Prop1(string s); void Prop2 (string name, int val); void Prop3(); } public interface IPropsOne{ void Prop1(string s); void Prop2 (int val); void Prop3(); }
public class ClainTwo:IProps,IPropsOne { public void Prop1 (string s) {// склеивание методов Console.WriteLine(s); } public void Prop2(string s, int x) { // перегрузка методов Console.WriteLine(s + "; " + x); } public void Prop2 (int x) { Console.WriteLine(x); } void IProps.Prop3() { // переименование методов Console.WriteLine("Свойство 3 интерфейса 1"); } void IPropsOne.Prop3() { Console.WriteLine("Свойство 3 интерфейса 2"); } public void Prop3FromInterface1() { ((IProps)this).Prop3(); } public void Prop3FromInterface2() { ((IPropsOne)this).Prop3(); }
Наследование интерфейсов public interface IParent{ void ParentMethod(); } public interface ISon1:IParent{ void Son1Method(); } public interface ISon2:IParent{ void Son2Method(); } public class Pars:ISon1, ISon2{ public void ParentMethod() { Console.WriteLine("Это метод родителя!"); } public void Son1Method() { Console.WriteLine("Это метод старшего сына!"); } public void Son2Method() { Console.WriteLine("Это метод младшего сына!"); }