界面的目的是隐藏信息吗?
-
09-10-2019 - |
题
鉴于接口也用于帮助隐藏信息,仅为用户提供允许使用的可能方法的子集,例如,我有一个 Person
类和界面 IPerson
.
现在,我可以做
IPerson testy = new Person();
或者
Person testy = new 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中的类不可能隐式地使用比基类更多的成员,但是类可以实现许多接口,并可以代替任何一个。例如,词典和链接列表没有太多共同点,但可以列举它们。串行端口和列表箱没有太多共同点,但它们都可以被处置。
几乎所有界面都可以做到的,可以通过抽象基类也可以做得更好。界面可以做的一件事可以做到基础类别不能允许有限的多重继承形式。