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
чтобы получить доступ к Child
s методы, потому что это будет ошибкой в случае, если родитель не является дочерним.
В вашем примере все еще возможно получить доступ к дочерним методам, но вы должны привести x
к Child
первый, ((Child)x).ChildPrintMethod()
, Это правильно, потому что в случае, если x не является допустимым дочерним элементом, возникает исключение, когда происходит приведение, а не попытка запустить метод.
Вы можете заранее проверить, должно ли это работать, вместо того, чтобы отлавливать исключения, используя if (x is Child)
Редактировать:
Чтобы повторно использовать переменную, как если бы она была дочерней, вы можете создать локальную ссылку на нее следующим образом:
if (x is Child) {
Child y = (Child)x;
...
}
Нет такой вещи как "пропущенное наследование". Ваш объект просто просматривается через один из его интерфейсов, фактически скрывая все, что не объявлено в этом интерфейсе. В этом нет магии.