Шаг 137 - Избежание неоднозначности имён

В C# запрещено множественное наследование, но так как без этого нельзя было обойтись были введены интерфейсы с помощью которых можно было реализовать множественное наследование. Они представляют из себя абстрактные классы, по умолчанию доступ к членам интерфейса public. Артём это описывал в "Шаг 31 - Интерфейсы".

Но иногда возникают проблемы, скажем у нас есть интерфейсы:

internal interface IButton1
{
	void Draw();
}
internal interface IButton2
{
	void Draw();
}

И нам нужно создать кнопку реализующую эти оба интерфейса. Сделаем это.

internal class Derived: IButton1, IButton2
{
	public void Draw()
	{
		Console.WriteLine("что-то рисуем");
	}
}

Но здесь есть неопределённость метод какого интерфейса реализует наш класс.

Derived a = new Derived();
((IButton1)a).Draw();
((IButton2)a).Draw();

Посмотрим, что у нас получилось при запуске программы.

gif/137_1.gif (1772 b)

Мы видим, что вызывается один и тот же метод, но нам этого не надо. Для этого создадим другой класс:

internal class Derived2: IButton1, IButton2
{
	void IButton1.Draw()
	{
		Console.WriteLine ("что-то рисуем, интерфейс 1");
	}
	void IButton2.Draw()
	{
		Console.WriteLine("что-то рисуем, интерфейс 2");
	}
}

Здесь мы явно квалифицируем имя члена, для этого уберём модификатор доступа и поставим перед именем члена имя интерфейса Создадим класс.

Derived2 b = new Derived2();
((IButton1)b).Draw();
((IButton2)b).Draw();

и посмотрим, что у нас получилось

gif/137_2.gif (1936 b)

Теперь у нас всё работает как надо.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Leonid Molochniy - 23.10.2001