所以我做了一個依賴倒置原理的例子,我從類 powerSwitch 得到錯誤的輸出,如果它關閉,它應該打開燈或電視(擴展可切換抽象類)函式 turn_on/turn_off 并列印其當前狀態(開/關)。
我嘗試呼叫 clickSwitch() 兩次以獲得不同的結果,但我得到的只是輸出“燈已關閉”
public abstract class Switchable {
public State state;
abstract public void turn_on();
abstract public void turn_off();
}
public class Lamp extends Switchable {
public State state;
public Lamp()
{
state=State.off;
}
public void turn_on()
{
this.state=State.on;
System.out.println("lamp's on");
}
public void turn_off()
{
this.state=State.off;
System.out.println("lamp's off");
}
}
public class Television extends Switchable {
public State state;
public Television()
{
state=State.off;
}
public void turn_on()
{
this.state=State.on;
System.out.println("lamp's on");
}
public void turn_off()
{
this.state=State.off;
System.out.println("lamp's off");
}
}
public class PowerSwitch {
Switchable sw;
public PowerSwitch(Switchable sw)
{
this.sw=sw;
}
public void ClickSwitch()
{
if(sw.state==State.off)
{
sw.turn_on();
}
else
{
sw.turn_off();
}
}
}
public class Main {
public static void main(String[] args) {
Switchable sw=new Lamp();
PowerSwitch ps=new PowerSwitch(sw);
ps.ClickSwitch();
ps.ClickSwitch();
}
}
public enum State {
on , off ;
}
uj5u.com熱心網友回復:
從和類中洗掉state變數。TelevisionLamp
您的基類Switchable已經宣告state了變數,您應該使用它。你的兩個類Television都有Lamp自己的宣告,隱藏了原來的宣告。
如果您有 IDE(InteliJ),則應該提到您的類具有與父級相同名稱和型別的變數,并且標記為警告。
所以:
public abstract class Switchable {
public State state = State.off; // set up to off by default
abstract public void turn_on();
abstract public void turn_off();
}
public class Television extends Switchable {
public Television(){}
...
}
public class Lamp extends Switchable {
public Lamp(){}
...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/527235.html
上一篇:(discord.jsv14)MongoDB沒有正確保存用戶不和諧ID
下一篇:缺少退貨宣告,但不確定如何修復
