C# C接口和类。接口中所需的类中使用的变量不能是私有的,也不能是仅私有的公共变量。为什么?

C# C接口和类。接口中所需的类中使用的变量不能是私有的,也不能是仅私有的公共变量。为什么?,c#,class,oop,interface,C#,Class,Oop,Interface,我对C语言中的接口有一个问题。我制作了一个名为IPerson的接口,它需要一个名字和年龄。之后,我创建了一个从该接口继承的类,因此它需要一个名称和年龄。当我试图在类中编写这些变量时,它们只能是公共的,我不明白为什么 public interface IPerson { string name { get; set; } int age { get; set; } } public class Person : IPerson { // If I try to make

我对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; }
}

接口是您声明的一种契约。接口中声明的所有内容都需要可以从所述接口继承的类型中访问。当您现在将一个方法声明为private时,您无法从另一个试图执行契约的对象访问它,从而导致接口无法正确实现

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

在您的示例中,您从IPerson派生Person。现在想象一下,你这样使用它:

IPerson c = GetCustomer();
public IPerson GetCustomer() {
    // internal code
}
其中GetCustomer的定义如下:

IPerson c = GetCustomer();
public IPerson GetCustomer() {
    // internal code
}
您现在可以访问的只是接口中声明的给定值。这意味着名称和年龄在接口中定义并可访问。 比如说,Person还声明了一些其他属性,比如IPerson parent{get;set;}。在这种情况下,父级可以是Person类型,也可以是从IPerson继承的任何其他类型。但您可以始终确保分配给此属性的对象来自IPerson,并且将定义属性名称和年龄

也没有理由为私有成员声明接口。您的代码将从中获得什么好处?接口用于连接除接口之外对其他类型不太了解的对象。把它想象成一个电源插头:你把它插入插座,但它不在乎电源从哪里来。同样,插座也不关心电源的去向。这只是一种情况,两者都使用另一方可以交互的接口。 在类中仅为其本身使用接口是毫无意义的,因为类中没有隐藏或需要抽象的信息。

正如Max Play所说:


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


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


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

e、 g

这些成员只能通过对接口的引用公开访问

i、 你不能做以下事情

Person me = new Person();
Console.WriteLine(me.Name);  // Won't compile
IPerson me2 = new Person();
Console.WriteLine(me2.Name); // Will compile
但是你可以做以下事情

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

你为什么要这么做?接口就像是向世界宣布你支持什么。即我的店铺支持无现金支付!!!!只是为了隐藏它。。。这真的没有道理。简言之,没有必要声明您支持某个东西,并且声明它是私有的,所以没有人知道。你需要重新思考你的问题,并向自己证明为什么你真的需要interface@MichaelRandall有时,人们必须实现一个接口来将他们的代码集成到一个框架中,但并不希望将该接口公开给他们代码中不需要或不使用该接口的其他部分。在这种情况下,我将实现接口explicitly@Mick同意。然而,这是一个.net设计用来解决另一个问题的黑客攻击,是的,它确实竭尽全力隐藏它,尽管我高度怀疑OP的情况是否如此,并且很可能没有理解OP为什么需要一个接口,并导致更大的代码气味和有问题的设计。@MichaelRandall谁知道David为什么要隐藏其接口的实现。我怀疑这段代码不仅仅是一个例子。在@MichaelRandall这里隐藏接口的公共实现有很多原因。我不确定我是否需要运气,在生产系统中永远不会依赖它。不过还是要谢谢你。诚然,如果在大多数代码中不完全缺少接口的显式实现,那么接口的显式实现应该是不常见的,但是也存在有效的异常。很有可能你是对的,David的动机可能不属于这一类,但每个人都必须经历一个学习过程。你在界面中放置的所有东西都必须在你实现的对象的任何实例中都可以访问。-事实并非如此。什么是显式实现?@Enigmativity即使它是显式实现的,它仍然是可访问的,它只是意味着你需要通过接口而不是类本身来访问它。@Servy-是的,但是
Eve在实现对象的任何实例中都可以访问。。只有通过接口才能访问它。@Enigmativity你是对的,因为我从来没有强制过显式实现