C# Интерфейсы и классы. Переменные, используемые в классе, необходимые в интерфейсе, не могут быть приватными или только приватными publi c. Почему? - PullRequest
0 голосов
/ 24 февраля 2020

У меня проблема с интерфейсами в C#. Я сделал интерфейс под названием IPerson, которому нужны имя и возраст. После этого я создал класс, который наследуется от этого интерфейса, поэтому ему нужны имя и возраст. Когда я пытаюсь записать эти переменные в классе, они могут быть опубликованы только c, и я не понимаю, почему.

public interface IPerson
{
    string name { get; set; }
    int age { get; set; }
}

public class Person : IPerson
{
    // If I try to make them private or protected, they don't work. and IPerson will be colored red. Only if they are public it's good, why ?
    private string name { get; set; } 
    private int age { get; set; }
}

Ответы [ 3 ]

3 голосов
/ 24 февраля 2020

Возможно, вам нужно реализовать интерфейс явно ...

например,

public interface IPerson
{
    string Name { get; set; }
    int Age { get; set; }
}

public class Person : IPerson
{
    string IPerson.Name { get; set; } 
    int IPerson.Age { get; set; }
}

Эти члены могут быть доступны публично только через ссылку на интерфейс.

т.е. Вы не можете делать следующее ...

Person me = new Person();
Console.WriteLine(me.Name);  // Won't compile

, но вы можете делать следующее ...

IPerson me2 = new Person();
Console.WriteLine(me2.Name); // Will compile
2 голосов
/ 24 февраля 2020

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

Это также причина, почему интерфейсы делают не иметь декларации доступа. Свойства, методы и события, определенные в интерфейсе, должны быть опубликованы c, поскольку в противном случае доступ к экземпляру класса через интерфейс не будет работать.

В вашем примере вы получаете Person из IPerson. А теперь представьте, что вы используете это так:

IPerson c = GetCustomer();

, где GetCustomer определено так:

public IPerson GetCustomer() {
    // internal code
}

Все, к чему у вас есть доступ, это заданные значения, объявленные в интерфейс. Это означает, что name и age определены в интерфейсе и доступны.
Допустим, Person также объявляет некоторые другие свойства, такие как IPerson parent { get; set; }. В этом случае родитель может иметь тип Person или любой другой тип, который наследуется от IPerson. Но вы всегда можете быть уверены, что объект, которому присвоено это свойство, получен из IPerson и будет иметь определенные свойства name и age.

Также нет причин объявлять интерфейс для частные участники. Какая польза от этого вашего кода? Существуют интерфейсы для соединения объектов, которые мало знают о другом типе, кроме интерфейса. Думайте об этом, как о штепсельной вилке: вы подключаете ее к розетке, но все равно, откуда исходит питание. И также, розетка не заботится о том, куда идет питание. Это просто тот случай, когда оба используют интерфейс, с которым может взаимодействовать другой.
Использование интерфейса в классе только для себя было бы бессмысленным, потому что нет никакой информации, которая скрыта или должна быть абстрагирована внутри класса.

1 голос
/ 24 февраля 2020

Как сказал Макс Плей:

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

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

Но если вы все еще хотите использовать шаблон, в котором вы хотите выбрать, какое свойство может быть приватным, publi c или защищенным, можно создать абстрактный класс вместо интерфейса

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