据说封装包含了对象外部不需要的数据和方法以及隐藏功能(方法和实例变量)
我的问题是只将变量设为私有而公共是封装?或者创建一个带抽象的类也是封装?
例如: 我有开关(Electic Switch)类开或关 制作一个Switch类我使用了抽象 我使用抽象封装了Switch类,以便我可以映射 电动机或灯泡或任何电动仪器
public class Switch {
private boolean isOff = true;
private ISwitchListener listener;
public Switch(ISwitchListener listener) {
this.listener = listener;
}
public void trigger() {
isOff = !isOff;
if(isOff) {
listener.off();
} else {
listener.on();
}
}
}
public class Bulb implements ISwitchListener {
@Override
public void on() {
// TODO Auto-generated method stub
System.out.println("bulb is glittering");
}
@Override
public void off() {
// TODO Auto-generated method stub
System.out.println("bulb is not glittering");
}
}
public interface ISwitchListener {
public void on();
public void off();
}
public class Executor {
public static void main(String[] args) {
// TODO Auto-generated method stub
Switch swt = new Switch(new Bulb());
swt.trigger();
}
}
如果我不在这里使用抽象,我会有类似下面的课程
public class Switch {
private boolean isOff = true;
public void trigger() {
isOff = !isOff;
Bulb b =new Bulb();
if(isOff) {
b.off();
} else {
b.on();
}
}
}
当我想将Motor映射到Switch时,我需要将类更改为bleow
public class Switch {
private boolean isOff = true;
public void trigger() {
isOff = !isOff;
Bulb b =new Bulb();
if(isOff) {
b.off();
} else {
b.on();
}
}
}
public class Motor {
public void on() {
// TODO Auto-generated method stub
System.out.println("Motor is rotating");
}
public void off() {
// TODO Auto-generated method stub
System.out.println("Motor is getting off to rotate");
}
}
答案 0 :(得分:1)
一般来说,不,抽象和封装是两回事。具体而言,抽象意味着删除对于代码或模型的预期目的而言不必要的细节。例如,如果您编写一个程序来计算房屋需要多少油漆,那么您的房屋模型需要包括表面区域,但不需要包括地址或院子的大小。 封装意味着隐藏对象或模块的内部工作,使得可以控制和容易地改变对象之间的耦合。如果没有封装,则对象的客户端可能直接引用其内部元素,这意味着如果修改了对象,则必须更改所有客户端。
关于代码示例,我认为更好的解决方案是创建一个“Switchable”接口,让Motor和Bulb实现它。像这样:
public interface Switchable {
void on();
void off();
}
public class Motor implements Switchable {
public void on() {
System.out.println("Motor is rotating");
}
public void off() {
System.out.println("Motor is getting off to rotate");
}
}
public class Switch {
private boolean isOff = true;
private Switchable switchable;
public Switch(Switchable switchable) {
this.switchable = switchable;
}
public void trigger() {
isOff = !isOff;
if(isOff) {
switchable.off();
} else {
switchable.on();
}
}
}
希望有所帮助。
答案 1 :(得分:0)
你的第一个例子是依赖注入的例子=>你让调用者决定类“Switch”需要做哪个具体类。
事实上,它是数据隐藏的“对立面”,因为外界必须知道“Switch”类的一些实现细节。 =>它需要一个ISwitchListener
的实现答案 2 :(得分:0)
正如@T我所说的,它可以是一种隐藏在例如Java 8中的方法,您可以在界面中创建默认实现,因此您可以在实现该接口的类中隐藏它。
但封装是关于字段(实例变量)隐藏的。创建私有成员(实例变量)并创建setter和getter。您只能通过专用方法达到该值。
如果要封装方法,则需要处理可访问性(请参阅default和protected修饰符)。
所以你的问题的答案是:不。制作一个抽象的类不是封装。
答案 3 :(得分:0)
抽象和封装是相互关联的。您可以说封装系统需要抽象。 抽象是指客户端系统不需要知道的内容多于界面中的内容。 封装是指模块的客户端无法了解接口中的内容。
请参阅此page以获取有关此主题的精彩文章。