0

我对 C# 中的接口有疑问。我制作了一个名为 IPerson 的界面,它需要一个名字和年龄。之后,我创建了一个继承自该接口的类,因此它需要一个名称和年龄。当我尝试在课堂上编写这些变量时,它们只能是公共的,我不明白为什么。

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; }
}
4

3 回答 3

3

也许你想要的是明确地实现接口......

例如

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
于 2020-02-23T23:54:41.467 回答
2

接口是您声明的一种合同。接口中声明的所有内容都需要在从所述接口继承的类型中可访问。当您现在将方法声明为私有时,您无法从尝试制定合同的其他对象访问它,从而导致接口未正确实现。

这也是为什么接口没有访问器声明的原因。接口中定义的属性、方法和事件都必须是公共的,否则通过接口访问类实例将不起作用。

在您的示例中,您PersonIPerson. 现在想象一下,你像这样使用它:

IPerson c = GetCustomer();

whereGetCustomer定义如下:

public IPerson GetCustomer() {
    // internal code
}

您现在可以访问的只是接口中声明的给定值。这意味着nameage在接口中定义并且是可访问的。
假设, Person 还声明了一些其他属性,例如IPerson parent { get; set; }. 在这种情况下,父对象可能是Person继承自 IPerson 的类型或任何其他类型。但是您始终可以确定分配给此属性的对象源自IPerson并将具有这些属性name并已age定义。

也没有理由为私有成员声明接口。你的代码有什么好处?接口的存在是为了连接对其他类型不太了解的对象,除了接口。把它想象成一个电源插头:你把它插到插座上,但它并不关心电源是从哪里来的。同样,插座也不关心电源的去向。只是两者都使用彼此可以交互的接口。
在一个类中只为它自己使用一个接口是没有意义的,因为在一个类中没有隐藏或需要抽象的信息。

于 2020-02-23T23:23:29.277 回答
1

正如 Max Play 所说:

接口是您声明的一种合同。接口中声明的所有内容都需要在从所述接口继承的类型中可访问。

您放置在接口中的所有内容都必须在您实现的对象的任何实例中都可以访问,除非它在其中使用显式实现。

但是,如果您仍然想使用一种模式来选择哪些属性可以是私有的、公共的或受保护的,一个选项是创建一个抽象类,而不是接口

于 2020-02-23T23:42:32.963 回答