我对抽象和封装感到困惑。我觉得这个类是封装,因为它封装了数据和行为,而接口是抽象的。请发表评论
答案 0 :(得分:13)
我认为你的术语很混乱。
Encapsulation - 将相关数据和功能放在一个位置。我们可以通过课程
Polymorphism - 允许使用统一界面处理不同数据类型的值。
可以通过继承基类(使用虚函数)和/或实现接口来实现多态性。
这些技术(和其他技术)给我们abstraction,它真正适用于我们用来将问题分解成更小组件的任何过程。
修改强>
问)你问“我能否说,抽象是通过封装和多态实现的最顶层?”
A)我无法回答这个问题,我不知道你的意思是“最高”和“最高”。 这里没有层次结构。
Functional Decomposition是一种抽象形式,它可以在不使用面向对象的情况下实现,它应该在层次结构中出现在哪里?
我能用层次结构做的最好的就是这个定义(直接来自我自己的头脑,所以YMMV)
答案 1 :(得分:4)
查看关于abstraction in Computer Science的维基百科文章。特别是,您可能对面向对象编程的抽象感兴趣。我引用了以下相关部分的部分内容:
在面向对象编程理论中, 抽象涉及设施 定义表示抽象的对象 报告,可以执行工作的“演员” 并改变他们的状态 与其他物体“沟通” 系统。封装一词 是指隐藏国家细节, 但扩展了数据类型的概念 从早期的编程语言到 最强烈地关联行为 数据,并标准化的方式 不同的数据类型相互作用,是 抽象的开始。什么时候 抽象进入了 定义的操作,启用对象 要替换的不同类型 它被称为多态性。当它 向相反的方向前进, 在类型或类中, 构建它们以简化复杂 一组关系,它被称为 授权或继承。
通常,我会说接口AND类应该是抽象的例子,将数据作为概念“事物”而不是原始数据来处理。封装用于使这些抽象与概念上不同的“事物”的其他抽象一起很好地工作。
答案 2 :(得分:2)
我认为你说得对。一个界面广泛地说:这就是这种事情。一堂课说:这里的东西是如何运作的;我会隐藏自己内部的细节。类是接口抽象的(通常)具体实现。
答案 3 :(得分:1)
封装的目的是隐藏实现细节:
一个非常人为的例子:
public class Person {
private int age;
public boolean canBuyBeer() {
return age >= 21;
}
}
您可能稍后将其更改为:
public class Person {
private int age;
private boolean isInUSA
public boolean canBuyBeer() {
if( isInUSA )
return age >= 21;
else
return age >= 18;
}
}
有关年龄和原籍的规则可能会发生变化,但来电者无需知道。
接口可用于抽象出不同的类型。考虑一下:
public interface Beverage {
public boolean containsAlchohol;
}
public class Soda implements Beverage {
public boolean containsAlchohol {
return false;
}
}
public class Beer implements Beverage {
public boolean containsAlchohol {
return true;
}
}
您可以更新人员:
public class Person {
private int age;
private boolean isInUSA
public boolean canBuyBeverage(Beverage b) {
if( b.containsAlchohol() ) {
if( isInUSA )
return age >= 21;
else
return age >= 18;
}
else {
return true;
}
}
}
因此,如果一个人可以购买某种类型的饮料,那么Person就会封装逻辑。饮料界面抽象出与饮料相关的逻辑。
可以有更好的例子,但这是一般的想法。