Интерфейс - это вид контракта, который вы заявляете. Все, что объявлено в интерфейсе, должно быть доступно в типе, который наследуется от указанного интерфейса. Теперь, когда вы объявляете метод как закрытый, вы не можете получить к нему доступ из другого объекта, который пытается заключить договор, в результате чего интерфейс не реализуется правильно.
Это также причина, почему интерфейсы делают не иметь декларации доступа. Свойства, методы и события, определенные в интерфейсе, должны быть опубликованы c, поскольку в противном случае доступ к экземпляру класса через интерфейс не будет работать.
В вашем примере вы получаете Person
из IPerson
. А теперь представьте, что вы используете это так:
IPerson c = GetCustomer();
, где GetCustomer
определено так:
public IPerson GetCustomer() {
// internal code
}
Все, к чему у вас есть доступ, это заданные значения, объявленные в интерфейс. Это означает, что name
и age
определены в интерфейсе и доступны.
Допустим, Person также объявляет некоторые другие свойства, такие как IPerson parent { get; set; }
. В этом случае родитель может иметь тип Person
или любой другой тип, который наследуется от IPerson. Но вы всегда можете быть уверены, что объект, которому присвоено это свойство, получен из IPerson
и будет иметь определенные свойства name
и age
.
Также нет причин объявлять интерфейс для частные участники. Какая польза от этого вашего кода? Существуют интерфейсы для соединения объектов, которые мало знают о другом типе, кроме интерфейса. Думайте об этом, как о штепсельной вилке: вы подключаете ее к розетке, но все равно, откуда исходит питание. И также, розетка не заботится о том, куда идет питание. Это просто тот случай, когда оба используют интерфейс, с которым может взаимодействовать другой.
Использование интерфейса в классе только для себя было бы бессмысленным, потому что нет никакой информации, которая скрыта или должна быть абстрагирована внутри класса.