制作带抽象的类也是封装?

时间:2015-03-17 08:07:05

标签: java oop encapsulation abstraction

据说封装包含了对象外部不需要的数据和方法以及隐藏功能(方法和实例变量)

我的问题是只将变量设为私有而公共是封装?或者创建一个带抽象的类也是封装?

例如: 我有开关(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");
    }
}

4 个答案:

答案 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以获取有关此主题的精彩文章。