第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

用子類類型覆蓋變量

用子類類型覆蓋變量

忽然笑 2022-05-21 13:11:48
我有一個(gè)具有偵聽器接口的類。我想創(chuàng)建一個(gè)子類,偵聽器接口是子類類型。例如: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(){...});會(huì)起作用,因?yàn)?OnCryingListener 是 OnSadListener 的子類。但是那樣我就不能打電話imCrying()了,或者它會(huì)是空的。有沒有辦法OnCryingListener listener“覆蓋”Person的OnSadListener listener?
查看完整描述

2 回答

?
慕姐4208626

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊

您需要覆蓋類setListener(OnSadListener)中的方法Baby,因?yàn)槟鷱牟辉O(shè)置偵聽器。


class Baby extends Person {

    OnCryingListener listener;


    @Override

    void setListener(OnSadListener listener) {

        this.listener = (OnCryingListener) listener;

    }


    void cry() {

        listener.imSad();

        listener.imCrying();

    }

}

一個(gè)更完整的例子如下......


class Person {

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


    void setListener(OnSadListener listener) {

        this.listener = listener;

    }

}

通過使listener受保護(hù),您可以重用Person類' OnSadListener。您只需要將偵聽器強(qiáng)制轉(zhuǎn)換為 aOnCryingListener即可調(diào)用該imCrying()方法。


class Baby extends Person {

    @Override

    void setListener(OnSadListener listener) {

        this.listener = (OnCryingListener) listener;

    }


    void cry() {

        listener.imSad();

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

    }

}

更新

如果你想使用泛型,你可以去掉強(qiáng)制轉(zhuǎn)換的需要。


public class Person <T extends OnSadListener> {

    protected T listener;


    public void setListener(T listener) {

        this.listener = listener;

    }

}

現(xiàn)在您可以知道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

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-05-21
?
絕地?zé)o雙

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊

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

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

但實(shí)際上,一個(gè)Baby對(duì)象中有 2 個(gè)字段。調(diào)用時(shí)michael.setListener(),只設(shè)置類中聲明的字段Person。


查看完整回答
反對(duì) 回復(fù) 2022-05-21
  • 2 回答
  • 0 關(guān)注
  • 106 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)