C# 界面的目的是隐藏信息吗?

C# 界面的目的是隐藏信息吗?,c#,oop,interface,information-hiding,C#,Oop,Interface,Information Hiding,考虑到接口也被用来帮助隐藏信息,只给用户提供了允许他们使用的可能方法的子集,比如说,我有一个Person类和接口IPerson 现在,大体上,我是被允许这样做的 IPerson testy = new Person(); 或 所以实际上我还没有被限制使用Person。那么接口如何真正隐藏数据呢?如果没有Person类该怎么办 或 如果你没有那个人的课怎么办 或 接口本身不用于隐藏任何内容。它用于在调用方和实现之间建立契约。本合同承诺这些方法和属性将在这里,并且不会改变 接口还提供了很好的可能性

考虑到接口也被用来帮助隐藏信息,只给用户提供了允许他们使用的可能方法的子集,比如说,我有一个Person类和接口IPerson

现在,大体上,我是被允许这样做的

IPerson testy = new Person();


所以实际上我还没有被限制使用Person。那么接口如何真正隐藏数据呢?

如果没有Person类该怎么办


如果你没有那个人的课怎么办


接口本身不用于隐藏任何内容。它用于在调用方和实现之间建立契约。本合同承诺这些方法和属性将在这里,并且不会改变

接口还提供了很好的可能性,可以在调用方不必处理的情况下改变实现。这在解耦设计中至关重要


您的问题意味着您的主要用户希望了解Person类的所有信息。实际上得到的是耦合代码,这更难测试。要解决这个问题,你必须改变你的思维方式并思考:main不想了解关于Person的一切,它只对IPerson感兴趣,只需要接口。不多不少。

接口本身不用于隐藏任何内容。它用于在调用方和实现之间建立契约。本合同承诺这些方法和属性将在这里,并且不会改变

接口还提供了很好的可能性,可以在调用方不必处理的情况下改变实现。这在解耦设计中至关重要


您的问题意味着您的主要用户希望了解Person类的所有信息。实际上得到的是耦合代码,这更难测试。要解决这个问题,你必须改变你的思维方式并思考:main不想了解关于Person的一切,它只对IPerson感兴趣,只需要接口。没有更多,也没有更少。

你的误解来自隐藏信息的含义。无论您从谁那里听到这句话,都意味着实现接口允许类将其前向方法与其内部实现分离

这也称为封装,其好处是允许设计者更改对象的内部机制,而不会中断围绕其公共接口编写的现有代码,从而使更改更容易。因此,您经常会听到接口被描述为契约,因为它在类的用户和实现者之间创建了一个隐式协议,即它的前向方法将保持一致。而且,由于多个类可以实现一个接口,一个组件可以很容易地替换为不同的组件,只要它实现相同的公共接口。Grady Booch是一本备受尊敬的面向对象设计书籍的作者,他对封装的定义如下:

将构成其结构和行为的抽象元素进行划分的过程;封装用于分离抽象的契约接口及其实现

对象的使用者不必知道或了解该对象的设计者是如何在幕后实现其功能的。想想你的微波炉:用微波炉做点心所需要做的就是按下前面的几个按钮。那是你微波炉的公共接口。仅仅为了制作一袋爆米花,不需要理解其设计背后的科学原理。这里接口的好处是它们降低了复杂性,并使其他开发人员更容易使用您的类

因此,回到问题中给出的示例,您不应该被限制使用Person类,但是您可能会被该类公开的、您可以访问的方法所限制。例如,Person类可以在单独的FirstName和LastName字段中内部存储人名,但只能公开一个Name属性,该属性返回两个私有名称字段的串联


但面向对象的设计和术语相当复杂。我强烈建议你找一本关于这些概念的好书仔细阅读。你会因此成为一名更好的程序员。

你的误解来自隐藏信息的含义。无论您从谁那里听到这句话,都意味着实现接口允许类将其前向方法与其内部实现分离

这也称为封装,其好处是允许设计者更改对象的内部机制,而不会中断围绕其公共接口编写的现有代码,从而使更改更容易。因此,您经常会听到接口被描述为契约,因为它是c 在类的用户和实现者之间创建一个隐式协议,即它的前向方法将保持一致。而且,由于多个类可以实现一个接口,一个组件可以很容易地替换为不同的组件,只要它实现相同的公共接口。Grady Booch是一本备受尊敬的面向对象设计书籍的作者,他对封装的定义如下:

将构成其结构和行为的抽象元素进行划分的过程;封装用于分离抽象的契约接口及其实现

对象的使用者不必知道或了解该对象的设计者是如何在幕后实现其功能的。想想你的微波炉:用微波炉做点心所需要做的就是按下前面的几个按钮。那是你微波炉的公共接口。仅仅为了制作一袋爆米花,不需要理解其设计背后的科学原理。这里接口的好处是它们降低了复杂性,并使其他开发人员更容易使用您的类

因此,回到问题中给出的示例,您不应该被限制使用Person类,但是您可能会被该类公开的、您可以访问的方法所限制。例如,Person类可以在单独的FirstName和LastName字段中内部存储人名,但只能公开一个Name属性,该属性返回两个私有名称字段的串联


但面向对象的设计和术语相当复杂。我强烈建议你找一本关于这些概念的好书仔细阅读。因此,您将成为一名更好的程序员。

在.net中,接口的基本用途是提供有限形式的多重继承。让一个类从另一个类继承有两个正交的目的:

这意味着基类的字段、方法和属性将充分满足派生类的需求,派生类可以使用这些字段、方法和属性,而无需重新指定。 这意味着期望基类方法的代码可以自动使用派生类的方法。 net中的一个类不可能隐式地使用多个基类的成员,但一个类可以实现许多接口,并且可以替换其中的任何接口。例如,字典和链表没有太多共同点,但它们都可以枚举。串行端口和列表框没有太多共同点,但它们都可以处理


接口可以做的几乎所有事情,都可以用抽象基类做得一样好或更好。接口可以做的一件事是基类不能做的,那就是允许有限形式的多重继承。

在.net中,接口的基本不能做任何其他方式的用途是提供有限形式的多重继承。让一个类从另一个类继承有两个正交的目的:

这意味着基类的字段、方法和属性将充分满足派生类的需求,派生类可以使用这些字段、方法和属性,而无需重新指定。 这意味着期望基类方法的代码可以自动使用派生类的方法。 net中的一个类不可能隐式地使用多个基类的成员,但一个类可以实现许多接口,并且可以替换其中的任何接口。例如,字典和链表没有太多共同点,但它们都可以枚举。串行端口和列表框没有太多共同点,但它们都可以处理

接口可以做的几乎所有事情,都可以用抽象基类做得一样好或更好。接口可以做的一件基类不能做的事情是允许有限形式的多重继承

Person testy = new Person();
 Object obj = loadObject();

 if(obj is IPerson) {

  IPerson person = (IPerson) obj;

 } 
  IPerson person = loadPerson();