Две стратегии реализации интерфейса. Проблемы множественного наследования

Страницы работы

Фрагмент текста работы

Интерфейсы

Интерфейс представляет собой полностью абстрактный класс, все методы которого абстрактны. Методы интерфейса имеют модификаторы public и abstract, заданные по умолчанию. Интерфейс позволяет описывать некоторые свойства, которыми могут обладать объекты разных классов. public interface IProps{ void Prop1(string s); void Prop2 (string name, int val); } public class Clain : IProps { …}

Две стратегии реализации интерфейса

  • Методы интерфейса должны быть обязательно реализованы в наследующем классе, иначе класс будет абстрактным.
  • Два способа реализации:
  • 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); } } // вызов методов интерфейса 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);

рrivate - реализация

  • public class ClainP:IProps{
  • void IProps.Prop1(string s) {
  • Console.WriteLine(s);
  • }
  • void IProps.Prop2(string name, int val) {
  • Console.WriteLine("name = {0}, val ={1}", name, val);
  • }
  • Обертывание - cоздается открытый метод, являющийся оберткой закрытого метода.
  • Кастинг - cоздается объект интерфейсного класса IProps, полученный преобразованием (кастингом) объекта исходного класса.
  • public void MyProp1(string s){
  • ((IProps)this).Prop1(s);
  • }
  • public void MyProp2(string s, int x){
  • ((IProps)this).Prop2(s, x);
  • }
  • }

Вызов методов интерфейса

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 IPropsOne { void Prop1(string s); void Prop2 (string name, int val); void Prop3(); } public interface IPropsTwo{ void Prop1(string s); void Prop2 (int val); void Prop3(); }

public class ClainM : IPropsOne, IPropsTwo { 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 IPropsOne.Prop3() { // закрытая реализация Console.WriteLine("Свойство 3 интерфейса 1"); } void IPropsTwo.Prop3() { Console.WriteLine("Свойство 3 интерфейса 2"); } public void Prop3FromInterface1() { // и переименование методов ((IPropsOne)this).Prop3(); } public void Prop3FromInterface2() { ((IPropsTwo)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("Это метод второго сына!"); } }

Встроенные интерфейсы

  • IComparable
  • public class Person : IComparable{
  • public int CompareTo( object pers) {
  • const string s = "Сравниваемый объект не принадлежит классу Person

Похожие материалы

Информация о работе