亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用子類類型覆蓋變量

用子類類型覆蓋變量

忽然笑 2022-05-21 13:11:48
我有一個具有偵聽器接口的類。我想創建一個子類,偵聽器接口是子類類型。例如:interface OnSadListener {    void imSad();}interface OnCryingListener extends OnSadListener {    void imCrying();}class Person {    OnSadListener listener;    void setListener(OnSadListener listener){        this.listener = listener;    }}class Baby extends Person {    OnCryingListener listener; // I want it to override the original one in Person    void cry(){        listener.imSad();        listener.imCrying();    }}void doIt(){    Baby michael = new Baby();    michael.setListener(new OnCryingListener() {        @Override void imSad(){            System.out.print("I'm sad");        }        @Override void imCrying(){            System.out.print("Wahhhhhh!");        }    });    michael.cry(); // the imCrying funtion is empty (setListener setted Person's listener and not Baby's)}我知道Baby.setListener(new OnCryingListener(){...});會起作用,因為 OnCryingListener 是 OnSadListener 的子類。但是那樣我就不能打電話imCrying()了,或者它會是空的。有沒有辦法OnCryingListener listener“覆蓋”Person的OnSadListener listener?
查看完整描述

2 回答

?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

您需要覆蓋類setListener(OnSadListener)中的方法Baby,因為您從不設置偵聽器。


class Baby extends Person {

    OnCryingListener listener;


    @Override

    void setListener(OnSadListener listener) {

        this.listener = (OnCryingListener) listener;

    }


    void cry() {

        listener.imSad();

        listener.imCrying();

    }

}

一個更完整的例子如下......


class Person {

    protected OnSadListener listener; // Make it protected or add accessor/mutators


    void setListener(OnSadListener listener) {

        this.listener = listener;

    }

}

通過使listener受保護,您可以重用Person類' OnSadListener。您只需要將偵聽器強制轉換為 aOnCryingListener即可調用該imCrying()方法。


class Baby extends Person {

    @Override

    void setListener(OnSadListener listener) {

        this.listener = (OnCryingListener) listener;

    }


    void cry() {

        listener.imSad();

        ((OnCryingListener) listener).imCrying(); // Cast here

    }

}

更新

如果你想使用泛型,你可以去掉強制轉換的需要。


public class Person <T extends OnSadListener> {

    protected T listener;


    public void setListener(T listener) {

        this.listener = listener;

    }

}

現在您可以知道Baby正在處理的偵聽器類型。


public class Baby extends Person<OnCryingListener> {

    @Override

    public void setListener(OnCryingListener listener) {

        this.listener = (OnCryingListener) listener;

    }


    public void cry() {

        listener.imSad();

        listener.imCrying(); // No need to cast

    }

}


查看完整回答
反對 回復 2022-05-21
?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

字段在 Java 中不會被“覆蓋”。只有方法被覆蓋。

由于您假設字段被覆蓋,因此在此示例中,您期望對象中只listener存在一個字段Baby。并且您期望在調用michael.setListener().

但實際上,一個Baby對象中有 2 個字段。調用時michael.setListener(),只設置類中聲明的字段Person


查看完整回答
反對 回復 2022-05-21
  • 2 回答
  • 0 關注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號