Почему переменная интерфейса типа, содержащая ссылку на объект класса, не вызывает функцию-член класса? - PullRequest
0 голосов
/ 12 ноября 2018

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

Public Interface IPerson 
{   
    void SetAge(int age);
}
Public class Man : IPerson
{
    Public void SetAge(int age ){}
    Public int GetAge(){return 20 ;}
}
Iperson p = new Man();

почему p не вызывает GetAge ()?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы забыли указать, куда вы звоните GetAge. Но в любом случае фактический тип Man - это информация о времени выполнения , которая недоступна компилятору. Представьте, что вы получите экземпляр IPerson от веб-службы

IPerson p = service.GetPerson();

Как компилятор должен знать, что этот экземпляр на самом деле Man или что-то еще? Представьте себе, что есть еще один класс, реализующий ваш интерфейс. Вы видите проблему? Компилятор не может знать, какой класс служба возвращает во время выполнения . Вот почему вы не можете получить доступ к членам, относящимся к реализующим классам. Там просто нет члена GetAge на IPerson. Фактически, любой базовый класс или -интерфейс не должен никогда * знать что-либо о своих дочерних классах.

Если вы знаете точный тип во время compile , вы можете, конечно, либо привести к этому конкретному типу, либо просто определить переменную для этого типа:

Man p = new Man();
0 голосов
/ 12 ноября 2018

Это потому, что вы создаете объект Man со ссылкой на метод IPerson, а метод GetAge() не принадлежит интерфейсу IPerson.

В соответствии с правилом присутствия методов наследования только в дочернем классе не может быть доступно через ссылку родителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...