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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.

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

Интерфейсы

Интерфейс представляет собой полностью абстрактный класс, все методы которого абстрактны. Методы интерфейса имеют модификаторы 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

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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.