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