接口的目的是隐藏信息吗?

鉴于接口也用于帮助隐藏信息,仅向用户提供允许使用的可能方法的子集,并且,假设我有一个
Person
类和接口
IPerson
。 现在在主,我被允许做
IPerson testy = new Person();
要么
Person testy = new Person();
所以我真的不限制使用Person了。那么界面如何真正隐藏数据呢?     
已邀请:
接口本身并不用于“隐藏”任何东西。它用于在调用者和实现之间建立合同。该合同承诺“这些方法和属性将在这里,它们不会改变”。 接口还开启了改变实现的可能性,而无需调用者处理它。这在去耦设计中至关重要。 你的问题意味着你的
main
想知道关于
Person
课程的一切。你实际得到的是耦合代码,这是更难测试。要“修复”这个你必须改变你的思维方式并思考:
main
不想知道关于
Person
的一切,它只对
IPerson
感兴趣并且只需要界面。不多也不少。     
你的误解来自于“隐藏信息”的含义。你从中听到这个意思的是,实现一个接口允许一个类将其前向方法与其内部实现分开。 这也称为“封装”,它的好处是允许设计者更改对象的内部机制,而不会破坏围绕它的公共接口编写的现有代码,从而更容易更改内容。因此,您经常会听到被描述为“契约”的接口,因为它在用户和类的实现者之间创建了一个隐含的协议,使其前向方法保持一致。并且因为多个类可以实现单个接口,所以只要它实现相同的公共接口,就可以轻松地用不同的组件替换一个组件。一本备受推崇的面向对象设计书籍的作者Grady Booch将封装定义如下:   划分构成其结构和行为的抽象要素的过程;封装用于分离抽象的合同接口及其实现。 对象的消费者不必知道或接触该对象的设计者如何在封面下实现其功能。想想你的微波炉:你需要做的就是用微波炉做点心就可以按下前面的几个按钮。这是微波炉的公共接口。没有必要了解其设计背后的科学原理只是为了制作一袋爆米花。这里的接口的好处是它们降低了复杂性并使其他开发人员更容易使用您的类。 因此,回过您问题中给出的示例,您不应该被限制使用
Person
类,但您可能会受限于您可以访问的该类公开的方法。例如,
Person
类可能会在单独的
FirstName
LastName
字段内部存储一个人的姓名,但只公开显示一个
Name
属性,该属性返回这两个私有名称字段的串联。 但面向对象的设计和术语相当复杂。我强烈建议您搜索一本关于概念的好书并仔细阅读。你会成为一个更好的程序员。     
如果你没有那个
Person
课怎么办?
 Object obj = loadObject();

 if(obj is IPerson) {

  IPerson person = (IPerson) obj;

 } 
要么
  IPerson person = loadPerson();
    
.net中接口的基本无法做任何其他目的是提供有限形式的多重继承。让一个类继承自另一个类有两个正交的目的: 这意味着派生类可以使用充分满足派生类需求的基类的字段,方法和属性,而无需重新指定。 这意味着需要基类方法的代码可以自动使用派生类的方法。 .net中的类不可能隐式地使用多于基类的成员,但是类可以实现许多接口,并且可以替代它们中的任何接口。例如,字典和链表没有太多共同之处,但它们都可以枚举。串行端口和ListBox没有太多共同之处,但它们都可以是Disposed。 几乎所有接口都可以做,使用抽象基类可以做得更好或更好。接口可以做的一件事是哪些基类不能允许有限形式的多重继承。     

要回复问题请先登录注册