В 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();
Посмотрим, что у нас получилось при запуске программы.
Мы видим, что вызывается один и тот же метод, но нам этого не надо. Для этого создадим другой класс:
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();
и посмотрим, что у нас получилось
Теперь у нас всё работает как надо.