C# множественное наследование интерфейса

Учитывая следующий код:

interface IParent
{
    void ParentPrintMethod();
}

interface IChild : IParent
{ 
    void ChildPrintMethod();
}

class Baby : IChild
{
    public void ParentPrintMethod()
    {
       Console.WriteLine("Parent Print Method");
    }

    public void ChildPrintMethod()
    {
       Console.WriteLine("Child Print Method");
    }

}

На данный момент все хорошо. Если бы вы создали новый экземпляр класса Baby следующим образом,

Baby x = new Baby();

все в порядке, и у вас будет доступ к ParentPrintMethod() и ChildPrintMethod();

Однако, может кто-нибудь объяснить мне, что произойдет, если вы будете делать следующее?

IParent x = new Baby();

Будет ли у вас доступ к ChildPrintMethod () в этом случае? Что именно происходит, когда вы делаете это?

5 ответов

Решение

Тогда вы указываете, что вы заинтересованы только в Interface объявлено Parent так что вы будете иметь доступ только к тем методам, объявленным в Parent даже если экземпляр самого объекта более доступен.

Нет, ты бы не стал. Переменная xкак тип Parent (кстати, интерфейсы идиоматически названы с I в начале) будет видеть только методы, определенные в Parent интерфейс. Период.

Ваша ссылка на объект будет вести себя как экземпляр родительского интерфейса и не будет иметь доступа к дочерним методам.

Это звучит действительно ненормально, но: Все ChildРен являются Parentс, но не все Parentс Childжэнь.

Это не имеет смысла для Parent чтобы получить доступ к Childs методы, потому что это будет ошибкой в ​​случае, если родитель не является дочерним.

В вашем примере все еще возможно получить доступ к дочерним методам, но вы должны привести x к Child первый, ((Child)x).ChildPrintMethod(), Это правильно, потому что в случае, если x не является допустимым дочерним элементом, возникает исключение, когда происходит приведение, а не попытка запустить метод.

Вы можете заранее проверить, должно ли это работать, вместо того, чтобы отлавливать исключения, используя if (x is Child)

Редактировать:

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

if (x is Child) {
    Child y = (Child)x;
    ...
}

Нет такой вещи как "пропущенное наследование". Ваш объект просто просматривается через один из его интерфейсов, фактически скрывая все, что не объявлено в этом интерфейсе. В этом нет магии.

Другие вопросы по тегам