what's interface vs. methods, abstraction vs. encapsulation in C++
当我和朋友讨论这些概念时,我很困惑。
我朋友的意见是
1)抽象是关于纯虚函数的。
2)接口不是成员函数,而是纯虚拟函数。
我发现在C++底层中,接口是数据类型支持的操作,所以成员函数是接口。
我的意见是
1)抽象是关于接口和实现的细化;
2)成员函数是接口。
有人能为我澄清这些概念吗?
1)抽象、抽象数据类型和抽象类的区别。
2)接口与成员函数的区别。
3)抽象与封装的区别。
我认为你的主要问题是你和你的朋友使用了两种不同的"界面"定义,所以你在不同的方面都是对的。
你在日常意义上使用"接口",如"我的电脑和键盘之间的接口是USB"或"真空和墙壁电源之间的接口是一个插座"。从这个意义上说,是的,方法(甚至是具体的方法)是接口,因为它们定义了一种与对象。这并不是说这不适用于软件——这是在术语"应用程序编程接口(API)"中使用的"接口"的含义。
您的朋友使用的是"接口",在更具体的面向对象编程术语中是"一组单独定义的操作,类可以选择这些操作来保证它将支持"。在这里,"接口"的定义特征是它没有自己的实现。类应该通过提供接口定义的方法的实现来支持接口。由于C++在这个意义上没有明确的接口概念,等价结构是一个纯虚拟函数(抽象数据类型)的类。
另一方面,"抽象"是关于很多事情的,而且你们都是对的。一般意义上的抽象意味着能够专注于更高层次的概念,而不是更低层次的细节。封装是一种抽象,因为它的目的是隐藏类方法的实现细节;实现可以在不更改类定义的情况下进行更改。纯虚拟函数(OO术语中的"接口")是另一种抽象类型,因为如果使用得当,它们不仅可以隐藏实现,还可以隐藏真正的底层对象类型;只要两种类型实现相同的接口,所使用的类型就可以更改。
相同的术语可以用于不同的事情,这就是这里发生的事情。
C++中的"抽象"意味着一种根本没有实现的方法(不能用抽象成员实例化对象)。
"抽象"只是"建模"的概念。建模通过忽略一些细节使一些复杂的事情看起来更简单。在编程中,您希望将操作和概念分解为组件,对于每个组件,抽象出不影响当前组件操作的外部组件的详细信息。
编程"接口"是实现"抽象"的一种方式。与其拥有组件的所有源代码和内部操作,不如只看到与对象使用方式相关的操作。C++中的一个"接口"是通过将一个类上的所有方法标记为"抽象"(也称为"纯虚拟")来实现的,这是通过在方法声明之后、在分号之前加上"=0"来完成的。必须将该方法标记为"virtual"才能使其合法。
换言之,抽象C++类是一种至少有一种纯虚方法,并且通过使所有成员函数纯虚拟化而在C++中实现接口。
封装是一个模糊的术语,但对我来说,它意味着一种实现抽象的技术。它的意思是"信息隐藏"。您隐藏了对象如何执行其"契约"的内部细节。契约是通过接口来表达的,在我看来,这是一种更强大的抽象形式。任何具有保护或私有成员的C++类都使用封装,但是仅实现纯虚拟方法的类描述了一个契约,承诺提供某些服务,对于这些服务,您完全不需要知道它们是如何实现的,或者关于同一对象可以实现的其他服务。
同一个对象可以填充多个契约,并且通过公开多个不相交的接口,它不会强制客户机了解对象的所有辅助功能。例如,一个对象可以告诉您一个银行帐户余额,也可以序列化/反序列化到数据库。您可以只拥有一个类,所有这些操作都作为成员函数公开。我更喜欢定义两个接口:"idatabaseserializable"和"ibankaccount",并将适当的操作放在适当的接口中,并从我的实现类中的两个接口派生。然后,只关心银行余额的客户机会看到尽可能少的额外信息,而数据库只看到它关心的操作。
抽象意味着有人可以在不了解实现细节的情况下使用您的代码。使这变得复杂的是,在一个上下文中实现细节的事物可能不在另一个上下文中。抽象数据类型是无法实例化的数据类型,只能描述其子类型的属性。抽象类只是抽象数据类型和类。
一个接口可以由一组成员函数隐式定义(尽管这是一个有用的抽象,但至少应该是虚拟的,这样接口就有多个可能的实现)。它也可以被明确地定义为一类只有纯虚函数(C++)或EDCOX1〔0〕(在爪哇,C和D)。
抽象是指你不必知道某个东西的实现细节的时候。封装就是你不知道它们的时候。例如,一个从OO角度设计得很好,但不需要将其成员变量设置为
虚拟成员函数(不完全纯)与继承是在C++中表达接口概念的一种方式,即接口和方法是正交概念。
C++中接口的另一种方法是泛型代码(即模板),在这种情况下,您通常不期望任何具体类型——相反,您希望该类型具有特定语义的某些成员函数——如果它不会得到编译错误。
有些人把这个概念称为,而你所说的类型建模是一个特定的概念。虽然C++没有正式支持概念,但是像Boost.ConceptCheck这样的库很好地提供了一个替代品。