🗊Презентация Интерфейсы

Нажмите для полного просмотра!
Интерфейсы, слайд №1Интерфейсы, слайд №2Интерфейсы, слайд №3Интерфейсы, слайд №4Интерфейсы, слайд №5Интерфейсы, слайд №6Интерфейсы, слайд №7Интерфейсы, слайд №8Интерфейсы, слайд №9Интерфейсы, слайд №10Интерфейсы, слайд №11Интерфейсы, слайд №12Интерфейсы, слайд №13Интерфейсы, слайд №14Интерфейсы, слайд №15Интерфейсы, слайд №16Интерфейсы, слайд №17Интерфейсы, слайд №18Интерфейсы, слайд №19Интерфейсы, слайд №20Интерфейсы, слайд №21Интерфейсы, слайд №22Интерфейсы, слайд №23Интерфейсы, слайд №24Интерфейсы, слайд №25Интерфейсы, слайд №26Интерфейсы, слайд №27Интерфейсы, слайд №28Интерфейсы, слайд №29Интерфейсы, слайд №30Интерфейсы, слайд №31Интерфейсы, слайд №32Интерфейсы, слайд №33Интерфейсы, слайд №34Интерфейсы, слайд №35Интерфейсы, слайд №36Интерфейсы, слайд №37Интерфейсы, слайд №38Интерфейсы, слайд №39Интерфейсы, слайд №40Интерфейсы, слайд №41Интерфейсы, слайд №42Интерфейсы, слайд №43Интерфейсы, слайд №44Интерфейсы, слайд №45Интерфейсы, слайд №46Интерфейсы, слайд №47Интерфейсы, слайд №48Интерфейсы, слайд №49Интерфейсы, слайд №50Интерфейсы, слайд №51Интерфейсы, слайд №52Интерфейсы, слайд №53Интерфейсы, слайд №54Интерфейсы, слайд №55Интерфейсы, слайд №56Интерфейсы, слайд №57Интерфейсы, слайд №58Интерфейсы, слайд №59

Содержание

Вы можете ознакомиться и скачать презентацию на тему Интерфейсы. Доклад-сообщение содержит 59 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





ИНТЕРФЕЙСЫ
Описание слайда:
ИНТЕРФЕЙСЫ

Слайд 2





Интерфейсы
В языке C# запрещено множественное наследование классов.
Описание слайда:
Интерфейсы В языке C# запрещено множественное наследование классов.

Слайд 3





Интерфейсы
Тем не менее, в C# существует концепция, позволяющая имитировать множественное наследование. 
Это концепция 
интерфейсов.
Описание слайда:
Интерфейсы Тем не менее, в C# существует концепция, позволяющая имитировать множественное наследование. Это концепция интерфейсов.

Слайд 4





Интерфейсы
Интерфейс представляет собой набор объявлений свойств, индексаторов, методов и событий. 
Класс или структура могут реализовывать определенный интерфейс.
В этом случае они берут на себя обязанность предоставить полную реализацию элементов интерфейса (хотя бы пустыми методами).
Описание слайда:
Интерфейсы Интерфейс представляет собой набор объявлений свойств, индексаторов, методов и событий. Класс или структура могут реализовывать определенный интерфейс. В этом случае они берут на себя обязанность предоставить полную реализацию элементов интерфейса (хотя бы пустыми методами).

Слайд 5





Интерфейсы
Интерфейс – это контракт, пункты которого суть свойства, индексаторы, методы и события. 
Если пользовательский тип реализует интерфейс, он берет на себя обязательство выполнить этот контракт.
Описание слайда:
Интерфейсы Интерфейс – это контракт, пункты которого суть свойства, индексаторы, методы и события. Если пользовательский тип реализует интерфейс, он берет на себя обязательство выполнить этот контракт.

Слайд 6





Интерфейс - это частный случай класса. 
Интерфейс представляет собой полностью абстрактный класс, все методы которого абстрактны. От абстрактного класса интерфейс отличается некоторыми деталями в синтаксисе и поведении. 
Синтаксическое отличие состоит в том, что методы интерфейса объявляются без указания модификатора доступа. 
Отличие в поведении заключается в более жестких требованиях к потомкам. Класс, наследующий интерфейс, обязан полностью реализовать все методы интерфейса. В этом - отличие от класса, наследующего абстрактный класс, где потомок может реализовать лишь некоторые методы родительского абстрактного класса, оставаясь абстрактным классом.
Описание слайда:
Интерфейс - это частный случай класса. Интерфейс представляет собой полностью абстрактный класс, все методы которого абстрактны. От абстрактного класса интерфейс отличается некоторыми деталями в синтаксисе и поведении. Синтаксическое отличие состоит в том, что методы интерфейса объявляются без указания модификатора доступа. Отличие в поведении заключается в более жестких требованиях к потомкам. Класс, наследующий интерфейс, обязан полностью реализовать все методы интерфейса. В этом - отличие от класса, наследующего абстрактный класс, где потомок может реализовать лишь некоторые методы родительского абстрактного класса, оставаясь абстрактным классом.

Слайд 7





Частные случаи 
Введение в язык частных случаев усложняет его и свидетельствует о некоторых изъянах, для преодоления которых и вводятся частные случаи. Например, введение структур в язык C# позволило определять классы как развернутые типы. Конечно, проще было бы ввести в объявление класса соответствующий модификатор, позволяющий любой класс объявлять развернутым. Но этого сделано не было, а, следуя традиции языка С++, были введены структуры как частный случай классов.
Описание слайда:
Частные случаи  Введение в язык частных случаев усложняет его и свидетельствует о некоторых изъянах, для преодоления которых и вводятся частные случаи. Например, введение структур в язык C# позволило определять классы как развернутые типы. Конечно, проще было бы ввести в объявление класса соответствующий модификатор, позволяющий любой класс объявлять развернутым. Но этого сделано не было, а, следуя традиции языка С++, были введены структуры как частный случай классов.

Слайд 8





Частные случаи 
Интерфейсы позволяют частично справиться с таким существенным недостатком языка, как отсутствие множественного наследования классов. Хотя реализация множественного наследования встречается с рядом проблем, его отсутствие существенно снижает выразительную мощь языка. В языке C# полного множественного наследования классов нет. Чтобы частично сгладить этот пробел, допускается множественное наследование интерфейсов. Обеспечить возможность классу иметь несколько родителей - один полноценный класс, а остальные в виде интерфейсов, - в этом и состоит основное назначение интерфейсов.
Описание слайда:
Частные случаи  Интерфейсы позволяют частично справиться с таким существенным недостатком языка, как отсутствие множественного наследования классов. Хотя реализация множественного наследования встречается с рядом проблем, его отсутствие существенно снижает выразительную мощь языка. В языке C# полного множественного наследования классов нет. Чтобы частично сгладить этот пробел, допускается множественное наследование интерфейсов. Обеспечить возможность классу иметь несколько родителей - один полноценный класс, а остальные в виде интерфейсов, - в этом и состоит основное назначение интерфейсов.

Слайд 9





Интерфейсы
Описание слайда:
Интерфейсы

Слайд 10





Интерфейсы
Обратите внимание – в определении элементов интерфейса отсутствуют модификаторы уровня доступа. Считается, что все элементы интерфейса имеют public уровень доступа. 
Следующие модификаторы не могут использоваться при объявлении членов интерфейса: abstract, public, protected, internal, private, virtual, override, static. 
Для свойства, объявленного в интерфейсе, указываются только ключевые слова get и (или) set.
Описание слайда:
Интерфейсы Обратите внимание – в определении элементов интерфейса отсутствуют модификаторы уровня доступа. Считается, что все элементы интерфейса имеют public уровень доступа. Следующие модификаторы не могут использоваться при объявлении членов интерфейса: abstract, public, protected, internal, private, virtual, override, static. Для свойства, объявленного в интерфейсе, указываются только ключевые слова get и (или) set.

Слайд 11





На основе интерфейса объявим класс:
Описание слайда:
На основе интерфейса объявим класс:

Слайд 12





Как это работает (способ 1):
Описание слайда:
Как это работает (способ 1):

Слайд 13





Можно сделать так (способ 2):
Описание слайда:
Можно сделать так (способ 2):

Слайд 14





!!!     Но нельзя:   !!!
интерфейс не имеет собственного конструктора!
Описание слайда:
!!! Но нельзя: !!! интерфейс не имеет собственного конструктора!

Слайд 15





Есть еще разница в способах 1 и 2: 
Добавим к классу CFalcon метод, не описанный в интерфейсе:
Описание слайда:
Есть еще разница в способах 1 и 2: Добавим к классу CFalcon метод, не описанный в интерфейсе:

Слайд 16





Интерфейсы
Описание слайда:
Интерфейсы

Слайд 17





Интерфейсы
Описание слайда:
Интерфейсы

Слайд 18





Если класс является производным от некоторого базового класса
Описание слайда:
Если класс является производным от некоторого базового класса

Слайд 19





теперь объект f1 умеет говорить
Описание слайда:
теперь объект f1 умеет говорить

Слайд 20





Если необходимо проверить, поддерживает ли объект некоего класса интерфейс
Описание слайда:
Если необходимо проверить, поддерживает ли объект некоего класса интерфейс

Слайд 21





Один класс может реализовывать несколько интерфейсов
Описание слайда:
Один класс может реализовывать несколько интерфейсов

Слайд 22





Один класс может реализовывать несколько интерфейсов
Описание слайда:
Один класс может реализовывать несколько интерфейсов

Слайд 23





Один класс может реализовывать несколько интерфейсов
Описание слайда:
Один класс может реализовывать несколько интерфейсов

Слайд 24





Две стратегии реализации интерфейса 
Давайте опишем некоторый интерфейс, задающий дополнительные свойства объектов класса:
interface IProps
{
	void Prop1(string s);
	void Prop2 (string name, int val);
}
У этого интерфейса два метода, которые и должны будут реализовать все классы - наследники интерфейса. Заметьте, у методов нет модификаторов доступа.
Описание слайда:
Две стратегии реализации интерфейса Давайте опишем некоторый интерфейс, задающий дополнительные свойства объектов класса: interface IProps { void Prop1(string s); void Prop2 (string name, int val); } У этого интерфейса два метода, которые и должны будут реализовать все классы - наследники интерфейса. Заметьте, у методов нет модификаторов доступа.

Слайд 25





Две стратегии реализации интерфейса 
Класс, наследующий интерфейс и реализующий его методы, может реализовать их явно, объявляя соответствующие методы класса открытыми. 
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 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); } }

Слайд 26





Две стратегии реализации интерфейса 
Класс реализует методы интерфейса, делая их открытыми для клиентов класса и наследников. 
Другая стратегия реализации состоит в том, чтобы все или некоторые методы интерфейса сделать закрытыми. Для реализации этой стратегии класс, наследующий интерфейс, объявляет методы без модификатора доступа, что по умолчанию соответствует модификатору private, и уточняет имя метода именем интерфейса.
Описание слайда:
Две стратегии реализации интерфейса Класс реализует методы интерфейса, делая их открытыми для клиентов класса и наследников. Другая стратегия реализации состоит в том, чтобы все или некоторые методы интерфейса сделать закрытыми. Для реализации этой стратегии класс, наследующий интерфейс, объявляет методы без модификатора доступа, что по умолчанию соответствует модификатору private, и уточняет имя метода именем интерфейса.

Слайд 27





Две стратегии реализации интерфейса 
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 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); } }

Слайд 28





Две стратегии реализации интерфейса 
Класс ClainP реализовал методы интерфейса IProps, но сделал их закрытыми и недоступными для вызова клиентов и наследников класса. Как же получить доступ к закрытым методам?
Описание слайда:
Две стратегии реализации интерфейса Класс ClainP реализовал методы интерфейса IProps, но сделал их закрытыми и недоступными для вызова клиентов и наследников класса. Как же получить доступ к закрытым методам?

Слайд 29





Есть два способа решения этой проблемы 

Обертывание. 



Кастинг.
Описание слайда:
Есть два способа решения этой проблемы Обертывание. Кастинг.

Слайд 30





Обертывание
Создается открытый метод, являющийся оберткой закрытого метода.
Описание слайда:
Обертывание Создается открытый метод, являющийся оберткой закрытого метода.

Слайд 31





Кастинг
Создается объект интерфейсного класса IProps, полученный преобразованием (кастингом) объекта исходного класса ClainP. Этому объекту доступны закрытые методы интерфейса.
Описание слайда:
Кастинг Создается объект интерфейсного класса IProps, полученный преобразованием (кастингом) объекта исходного класса ClainP. Этому объекту доступны закрытые методы интерфейса.

Слайд 32





Две стратегии реализации интерфейса 
В чем главное достоинство обертывания? Оно позволяет переименовывать методы интерфейса. Метод интерфейса со своим именем закрывается, а потом открывается под тем именем, которое класс выбрал для него.
Описание слайда:
Две стратегии реализации интерфейса В чем главное достоинство обертывания? Оно позволяет переименовывать методы интерфейса. Метод интерфейса со своим именем закрывается, а потом открывается под тем именем, которое класс выбрал для него.

Слайд 33





Две стратегии реализации интерфейса 
Вот пример обертывания закрытых методов в классе ClainP:
public void MyProp1(string s)
{
	((IProps)this).Prop1(s);
}
public void MyProp2(string s, int x)
{
	((IProps)this).Prop2(s, x);
}
Описание слайда:
Две стратегии реализации интерфейса Вот пример обертывания закрытых методов в классе ClainP: public void MyProp1(string s) { ((IProps)this).Prop1(s); } public void MyProp2(string s, int x) { ((IProps)this).Prop2(s, x); }

Слайд 34





Две стратегии реализации интерфейса 
Как видите, методы переименованы и получили другие имена, под которыми они и будут известны клиентам класса. В обертке для вызова закрытого метода пришлось использовать кастинг, приведя объект this к интерфейсному классу IProps.
Описание слайда:
Две стратегии реализации интерфейса Как видите, методы переименованы и получили другие имена, под которыми они и будут известны клиентам класса. В обертке для вызова закрытого метода пришлось использовать кастинг, приведя объект this к интерфейсному классу IProps.

Слайд 35





Преобразование к классу интерфейса
Создать объект класса интерфейса обычным путем с использованием конструктора и операции new нельзя. Тем не менее, можно объявить объект интерфейсного класса и связать его с настоящим объектом путем приведения (кастинга) объекта наследника к классу интерфейса. Это преобразование задается явно. Имея объект, можно вызывать методы интерфейса - даже если они закрыты в классе, для интерфейсных объектов они являются открытыми.
Описание слайда:
Преобразование к классу интерфейса Создать объект класса интерфейса обычным путем с использованием конструктора и операции new нельзя. Тем не менее, можно объявить объект интерфейсного класса и связать его с настоящим объектом путем приведения (кастинга) объекта наследника к классу интерфейса. Это преобразование задается явно. Имея объект, можно вызывать методы интерфейса - даже если они закрыты в классе, для интерфейсных объектов они являются открытыми.

Слайд 36





Преобразование к классу интерфейса
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 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); }

Слайд 37





Преобразование к классу интерфейса
Описание слайда:
Преобразование к классу интерфейса

Слайд 38





Проблемы множественного наследования 
При множественном наследовании классов возникает ряд проблем. Они остаются и при множественном наследовании интерфейсов, хотя становятся проще. Рассмотрим две основные проблемы - коллизию имен и наследование от общего предка.
Описание слайда:
Проблемы множественного наследования При множественном наследовании классов возникает ряд проблем. Они остаются и при множественном наследовании интерфейсов, хотя становятся проще. Рассмотрим две основные проблемы - коллизию имен и наследование от общего предка.

Слайд 39





Проблемы множественного наследования 
Коллизия имен
Проблема коллизии имен возникает, когда два или более интерфейса имеют методы с одинаковыми именами и сигнатурой. Сразу же заметим, что если имена методов совпадают, но сигнатуры разные, то это не приводит к конфликтам - при реализации у класса наследника просто появляются перегруженные методы. Но что следует делать классу-наследнику в тех случаях, когда сигнатуры методов совпадают? И здесь возможны две стратегии - склеивание методов и переименование.
Описание слайда:
Проблемы множественного наследования Коллизия имен Проблема коллизии имен возникает, когда два или более интерфейса имеют методы с одинаковыми именами и сигнатурой. Сразу же заметим, что если имена методов совпадают, но сигнатуры разные, то это не приводит к конфликтам - при реализации у класса наследника просто появляются перегруженные методы. Но что следует делать классу-наследнику в тех случаях, когда сигнатуры методов совпадают? И здесь возможны две стратегии - склеивание методов и переименование.

Слайд 40





Проблемы множественного наследования 
Стратегия склеивания применяется тогда, когда класс - наследник интерфейсов - полагает, что разные интерфейсы задают один и тот же метод, единая реализация которого и должна быть обеспечена наследником. В этом случае наследник строит единственную общедоступную реализацию, соответствующую методам всех интерфейсов, которые имеют единую сигнатуру.
Описание слайда:
Проблемы множественного наследования Стратегия склеивания применяется тогда, когда класс - наследник интерфейсов - полагает, что разные интерфейсы задают один и тот же метод, единая реализация которого и должна быть обеспечена наследником. В этом случае наследник строит единственную общедоступную реализацию, соответствующую методам всех интерфейсов, которые имеют единую сигнатуру.

Слайд 41





Проблемы множественного наследования 
interface IProps
{
	void Prop1(string s);
	void Prop2 (string name, int val);
	void Prop3();
}
interface IPropsOne
{
	void Prop1(string s);
	void Prop2 (int val);
	void Prop3();
}
Описание слайда:
Проблемы множественного наследования interface IProps { void Prop1(string s); void Prop2 (string name, int val); void Prop3(); } interface IPropsOne { void Prop1(string s); void Prop2 (int val); void Prop3(); }

Слайд 42





Проблемы множественного наследования 
public class ClainTwo:IProps,IPropsOne
{
	// склеивание методов двух интерфейсов
		public void Prop1 (string s)
	{
		Console.WriteLine(s);
	}
Описание слайда:
Проблемы множественного наследования public class ClainTwo:IProps,IPropsOne { // склеивание методов двух интерфейсов public void Prop1 (string s) { Console.WriteLine(s); }

Слайд 43





Проблемы множественного наследования 
Другая стратегия исходит из того, что,  методы разных интерфейсов должны быть реализованы по-разному. В этом случае необходимо переименовать конфликтующие методы.
Описание слайда:
Проблемы множественного наследования Другая стратегия исходит из того, что, методы разных интерфейсов должны быть реализованы по-разному. В этом случае необходимо переименовать конфликтующие методы.

Слайд 44





Проблемы множественного наследования 
Конечно, переименование можно сделать в самих интерфейсах, но это неправильный путь: наследники не должны требовать изменений своих родителей - они сами должны меняться. 
Для переименования метода интерфейса в самом классе наследника достаточно реализовать методы разных интерфейсов как закрытые, а затем открыть их с переименованием.
Описание слайда:
Проблемы множественного наследования Конечно, переименование можно сделать в самих интерфейсах, но это неправильный путь: наследники не должны требовать изменений своих родителей - они сами должны меняться. Для переименования метода интерфейса в самом классе наследника достаточно реализовать методы разных интерфейсов как закрытые, а затем открыть их с переименованием.

Слайд 45





Проблемы множественного наследования 
public class ClainTwo:IProps,IPropsOne
{/// перегрузка методов двух интерфейсов
	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 class ClainTwo:IProps,IPropsOne {/// перегрузка методов двух интерфейсов 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(); }

Слайд 46





Проблемы множественного наследования 
Для первого из методов с совпадающей сигнатурой выбрана стратегия склеивания, так что в классе есть только один метод, реализующий методы двух интерфейсов. Методы с разной сигнатурой реализованы двумя перегруженными методами класса. Для следующей пары методов с совпадающей сигнатурой выбрана стратегия переименования. Методы интерфейсов реализованы как закрытые методы, а затем в классе объявлены два новых метода с разными именами, являющиеся обертками закрытых методов класса.
Описание слайда:
Проблемы множественного наследования Для первого из методов с совпадающей сигнатурой выбрана стратегия склеивания, так что в классе есть только один метод, реализующий методы двух интерфейсов. Методы с разной сигнатурой реализованы двумя перегруженными методами класса. Для следующей пары методов с совпадающей сигнатурой выбрана стратегия переименования. Методы интерфейсов реализованы как закрытые методы, а затем в классе объявлены два новых метода с разными именами, являющиеся обертками закрытых методов класса.

Слайд 47





Проблемы множественного наследования 
public void TestCliTwoInterfaces()
{
	Console.WriteLine("Объект ClainTwo вызывает методы двух интерфейсов!");
	Cli.ClainTwo claintwo = new Cli.ClainTwo();
	claintwo.Prop1("Склейка свойства двух интерфейсов");
	claintwo.Prop2("перегрузка ::: ",99);
	claintwo.Prop2(9999);
	claintwo.Prop3FromInterface1();
	claintwo.Prop3FromInterface2();
	Console.WriteLine("Интерфейсный объект вызывает методы 1-го 
		интерфейса!");
	Cli.IProps ip1 = (Cli.IProps)claintwo;
	ip1.Prop1("интерфейс IProps: свойство 1");
	ip1.Prop2("интерфейс 1 ", 88);
	ip1.Prop3();
	Console.WriteLine("Интерфейсный объект вызывает методы 2-го
		интерфейса!");
	Cli.IPropsOne ip2 = (Cli.IPropsOne)claintwo;
	ip2.Prop1("интерфейс IPropsOne: свойство1");
	ip2.Prop2(7777);
	ip2.Prop3();
}
Описание слайда:
Проблемы множественного наследования public void TestCliTwoInterfaces() { Console.WriteLine("Объект ClainTwo вызывает методы двух интерфейсов!"); Cli.ClainTwo claintwo = new Cli.ClainTwo(); claintwo.Prop1("Склейка свойства двух интерфейсов"); claintwo.Prop2("перегрузка ::: ",99); claintwo.Prop2(9999); claintwo.Prop3FromInterface1(); claintwo.Prop3FromInterface2(); Console.WriteLine("Интерфейсный объект вызывает методы 1-го интерфейса!"); Cli.IProps ip1 = (Cli.IProps)claintwo; ip1.Prop1("интерфейс IProps: свойство 1"); ip1.Prop2("интерфейс 1 ", 88); ip1.Prop3(); Console.WriteLine("Интерфейсный объект вызывает методы 2-го интерфейса!"); Cli.IPropsOne ip2 = (Cli.IPropsOne)claintwo; ip2.Prop1("интерфейс IPropsOne: свойство1"); ip2.Prop2(7777); ip2.Prop3(); }

Слайд 48





Проблемы множественного наследования
Описание слайда:
Проблемы множественного наследования

Слайд 49





Наследование от общего предка 
Проблема наследования от общего предка характерна, в первую очередь, для множественного наследования классов. Если класс C является наследником классов A и B, а те, в свой черед, являются наследниками класса Parent, то класс наследует свойства и методы своего предка Parent дважды, один раз получая их от класса A, другой от - B. Это явление называется еще дублирующим наследованием. Для классов ситуация осложняется тем, что классы A и B могли по-разному переопределить методы родителя и для потомков предстоит сложный выбор реализации.
Описание слайда:
Наследование от общего предка Проблема наследования от общего предка характерна, в первую очередь, для множественного наследования классов. Если класс C является наследником классов A и B, а те, в свой черед, являются наследниками класса Parent, то класс наследует свойства и методы своего предка Parent дважды, один раз получая их от класса A, другой от - B. Это явление называется еще дублирующим наследованием. Для классов ситуация осложняется тем, что классы A и B могли по-разному переопределить методы родителя и для потомков предстоит сложный выбор реализации.

Слайд 50





Наследование от общего предка
Описание слайда:
Наследование от общего предка

Слайд 51





Наследование от общего предка 
Для интерфейсов сама ситуация дублирующего наследования маловероятна, но возможна, поскольку интерфейс, как и любой класс, может быть наследником другого интерфейса. Поскольку у интерфейсов наследуются только сигнатуры, а не реализации, как в случае классов, то проблема дублирующего наследования сводится к проблеме коллизии имен. По-видимому, естественным решением этой проблемы в данной ситуации является склеивание, когда методам, пришедшим разными путями от одного родителя, будет соответствовать единая реализация.
Описание слайда:
Наследование от общего предка Для интерфейсов сама ситуация дублирующего наследования маловероятна, но возможна, поскольку интерфейс, как и любой класс, может быть наследником другого интерфейса. Поскольку у интерфейсов наследуются только сигнатуры, а не реализации, как в случае классов, то проблема дублирующего наследования сводится к проблеме коллизии имен. По-видимому, естественным решением этой проблемы в данной ситуации является склеивание, когда методам, пришедшим разными путями от одного родителя, будет соответствовать единая реализация.

Слайд 52





Наследование от общего предка 
public interface IParent
{
	void ParentMethod();
}
public interface ISon1:IParent
{
	void Son1Method();
}
public interface ISon2:IParent
{
	void Son2Method();
}
Описание слайда:
Наследование от общего предка public interface IParent { void ParentMethod(); } public interface ISon1:IParent { void Son1Method(); } public interface ISon2:IParent { void Son2Method(); }

Слайд 53





Наследование от общего предка 
класс, наследующий оба интерфейса:
public class Pars:ISon1, ISon2
{
	public void ParentMethod()
	{
		Console.WriteLine("Это метод родителя!");
	}
	public void Son1Method()
	 {
		 Console.WriteLine("Это метод старшего сына!");
	 }
	public void Son2Method()
	{
		Console.WriteLine("Это метод младшего сына!");
	}
}
Описание слайда:
Наследование от общего предка класс, наследующий оба интерфейса: public class Pars:ISon1, ISon2 { public void ParentMethod() { Console.WriteLine("Это метод родителя!"); } public void Son1Method() { Console.WriteLine("Это метод старшего сына!"); } public void Son2Method() { Console.WriteLine("Это метод младшего сына!"); } }

Слайд 54





Наследование от общего предка 
Класс обязан реализовать метод ParentMethod, приходящий от обоих интерфейсов. Понимая, что речь идет о дублировании метода общего родителя - интерфейса IParent, лучшей стратегией реализации является склеивание методов в одной реализации, что и было сделано.
Описание слайда:
Наследование от общего предка Класс обязан реализовать метод ParentMethod, приходящий от обоих интерфейсов. Понимая, что речь идет о дублировании метода общего родителя - интерфейса IParent, лучшей стратегией реализации является склеивание методов в одной реализации, что и было сделано.

Слайд 55





Наследование от общего предка 
public void TestIParsons()
{	Console.WriteLine("Объект класса вызывает методы трех интерфейсов!");
	Cli.Pars ct = new Cli.Pars();
	ct.ParentMethod();
	ct.Son1Method();
	ct.Son2Method();
	Console.WriteLine("Интерфейсный объект 1 вызывает свои методы!");
	Cli.IParent ip = (IParent)ct;
	ip.ParentMethod();
	Console.WriteLine("Интерфейсный объект 2 вызывает свои методы!");
	Cli.ISon1 ip1 = (ISon1)ct;
	ip1.ParentMethod();
	ip1.Son1Method();
	Console.WriteLine("Интерфейсный объект 3 вызывает свои методы!");
	Cli.ISon2 ip2 = (ISon2)ct;
	ip2.ParentMethod();
	ip2.Son2Method();
}
Описание слайда:
Наследование от общего предка public void TestIParsons() { Console.WriteLine("Объект класса вызывает методы трех интерфейсов!"); Cli.Pars ct = new Cli.Pars(); ct.ParentMethod(); ct.Son1Method(); ct.Son2Method(); Console.WriteLine("Интерфейсный объект 1 вызывает свои методы!"); Cli.IParent ip = (IParent)ct; ip.ParentMethod(); Console.WriteLine("Интерфейсный объект 2 вызывает свои методы!"); Cli.ISon1 ip1 = (ISon1)ct; ip1.ParentMethod(); ip1.Son1Method(); Console.WriteLine("Интерфейсный объект 3 вызывает свои методы!"); Cli.ISon2 ip2 = (ISon2)ct; ip2.ParentMethod(); ip2.Son2Method(); }

Слайд 56





Наследование от общего предка
Описание слайда:
Наследование от общего предка

Слайд 57





Наследование интерфейсов
Подобно классам, интерфейсы могут наследоваться от других интерфейсов. 
При этом, в отличие от классов, наследование интерфейсов может быть множественным.
Описание слайда:
Наследование интерфейсов Подобно классам, интерфейсы могут наследоваться от других интерфейсов. При этом, в отличие от классов, наследование интерфейсов может быть множественным.

Слайд 58





Отличие интерфейса от абстрактного класса
Абстрактный класс, помимо абстрактных методов и свойств, может содержать конструкторы, поля и реализованные методы
Все, что определено в абстрактных классах, доступно только наследникам
Наследники абстрактного класса должны обязательно иметь реализацию абстрактных методов
Описание слайда:
Отличие интерфейса от абстрактного класса Абстрактный класс, помимо абстрактных методов и свойств, может содержать конструкторы, поля и реализованные методы Все, что определено в абстрактных классах, доступно только наследникам Наследники абстрактного класса должны обязательно иметь реализацию абстрактных методов

Слайд 59





Отличие интерфейса от абстрактного класса
Интерфейс выражает поведение, которое данный класс или структура может избрать для поддержки. Каждый класс (или структура) может поддерживать столько интерфейсов, сколько необходимо, и, следовательно, тем самым поддерживать множество поведений.
Описание слайда:
Отличие интерфейса от абстрактного класса Интерфейс выражает поведение, которое данный класс или структура может избрать для поддержки. Каждый класс (или структура) может поддерживать столько интерфейсов, сколько необходимо, и, следовательно, тем самым поддерживать множество поведений.



Похожие презентации
Mypresentation.ru
Загрузить презентацию