簡體   English   中英

如果被引用為超類,則在子類中調用方法的正確方法

[英]Proper way of calling a method in a subclass if it's referenced as a super class

class SuperClass () {
  doSuperStuff();
}

class SubClass extends SuperClass () {
  doStuff();
}

SuperClass aClass = new SubClass();

為了調用方法doStuff() ,我需要像(SubClass)aClass.doStuff();一樣(SubClass)aClass.doStuff();

  1. 通常是這樣嗎?
  2. 有沒有更好的辦法?
  3. 我是否應該總是以這種方式“初始化”子類,以防萬一我想將一堆SuperClass的子類放入數組或類似的東西?

更新:閱讀每個人的回復后:

好。 我肯定在我的理解中缺少一些東西。 我認為讓一個子類繼承超類的所有內容,然后再在子類中再做一個方法就可以了。 那我應該建立一個界面嗎?

另外,我有SuperClass class = new SubClass(); 但將其重命名為SuperClass aClass = new SubClass();

  • 首先,如果要從子類中調用方法,則首先不必使用超類的數據類型來創建變量。 您可以簡單地:

     MySubClass obj1 = new MySubClass(); 

obj1將能夠從其超類(由於繼承,但超類中的私有方法除外)和自身訪問兩種方法。

  • 其次,您不能將變量命名為class

  • 第三,如果要進行轉換,則如下所示:

     MySuperClass obj2 = new MySubClass(); ((MySubClass)obj2).doStuff(); 
  1. 您的代碼實際上將無法工作,但是可以,強制轉換是執行此操作的唯一方法(但不可行)。 您需要做的是((SubClass)class).doStuff();
  2. 不,我建議甚至不要這樣做
  3. 不需要。如果需要SubClass ,請將其聲明為SubClass 如果您有一組對象都從SuperClass繼承, SuperClass應該調用的唯一方法是在SuperClass定義的SuperClass 做其他事情會導致可怕的意大利面條,就像無法維護的代碼

如果doStuff()僅與子類有關,而在超類中沒有意義,則此時應使用子類實例。

但是,如果doStuff()在超類的所有子類中都具有語義有效性,則超類應具有在所有子類中實現的抽象方法doStuff()

另外,如果doStuff()僅適用於某些子類,則可以使用該方法定義一個接口,並讓那些子類實現該接口。

您使用哪種方法取決於整個應用程序的結構,而您實際上並未提供足夠的信息來幫助我們進一步指導您。

我認為這行可能不會編譯

SuperClass class = new SubClass();

但是,假設您擁有SuperClass clazz = new SubClass();。 聲明是在編譯時完成的,方法的調用也是如此。 因此,您只會看到在聲明clazz的類型上聲明的方法。 因此,是的,如果您需要調用子類方法,則需要對clazz進行適當的轉換。

關於第二個問題:如果您想利用多態行為,這是正確的做事方法……這導致我們提出第三個問題。 是的,這是通過在存儲在用基本類型聲明的集合或數組中后以統一的方式訪問一堆子類的行為的方式來利用多態性的方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM