static void Main(string[] args) { MyClass myClass = new MyClass(); Foo(myClass); Bar(myClass); MyOtherClass myOtherClass = new MyOtherClass(); // Создаём экземпляр класса. Он реализует два интерфейса, то этому может иметь оба типа данных Foo(myOtherClass); // Этот класс с явно определённой реализацией интерфейсов. Bar(myOtherClass); // Вызываем методы передавая параметром экземпляр класса, где явно реализованы оба метода интерфейсов IFirstInterface firstInterface = myOtherClass; // Если у нас есть интерфейс, то мы можем в ссылку присвоить экземпляр класса наследника firstInterface.Action(); // Вызвать нужный метод вместо конструкции высше ((IFirstInterface)myOtherClass).Action(); // Привели данные к типу IFirstInterface и вызвали метод Action ((ISecondInterface)myOtherClass).Action(); //if (myOtherClass is IFirstInterface ) }
static void Foo(IFirstInterface firstInterface) // Передаём параметром обьект типа (или ссылку) IFirstInterface, по этому вызывается именно его реализация { firstInterface.Action(); // Вызываем метод Action() у обьекта типа IFirstInterface }