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

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

使用變量類實例化抽象類

使用變量類實例化抽象類

當年話下 2022-07-27 21:52:16
由于顯而易見的原因,我們不能像這樣直接實例化一個抽象類:AbstractObj obj = new AbstractObj(); 其中 AbstractObj 是以下形式的一個類:public abstract class AbstractObj {//... Body omitted }但是,如果我們有擴展類,例如:public class ConcreteObj extends AbstractObj {//... Body omitted}public class AnotherObj extends AbstractObj {//... Body omitted}是否可以通過以下方式實例化對象?這將根據傳入的變量的類確定必須使用哪個構造函數?,F在假設 o1 和 o2 保證為相同類型。protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2){    AbstractObj delta = ...?}例如,在上面,如果 o1 是 ConcreteObj 類型,有沒有辦法在運行時識別它是否屬于這種類型并使用適當的構造函數?
查看完整描述

3 回答

?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

這里 :


protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2){

   AbstractObj delta = ...?

}

您可以獲得o1with的具體類o1.getClass()。然后,如果這個具體類有一個默認構造函數,你可以調用它Class.newInstance():


protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2) throws IllegalAccessException, InstantiationException{

   AbstractObj delta = o1.getClass().newInstance();

}


查看完整回答
反對 回復 2022-07-27
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

您可以使用 instanceof 語句。您可以將 o1 轉換為 ConcreteObj 并使用此類的方法或字段。


if(o1 instanceof ConcreteObj){

  //((ConcreteObj)o1).someMethod();

}


查看完整回答
反對 回復 2022-07-27
?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

這絕對是代碼氣味。不要使用 instanceof。不要使用反射。

絕對不要繼續走這條路。

您的所有AbstractObj實例都實現了一組通用操作。由于您computeDiff對 AbstractObjs 進行操作,因此它不能依賴于它接收的不同實現的任何特殊功能。

因此,方法接收或返回什么類型的對象并不重要,只要它們都遵守 AbstractObj 定義。如果需要,您可以返回一個擴展 AbstractObj 的匿名類或任何其他子類。您甚至可以為此目的創建一個特定的子類。但是無論你返回什么,它都不能返回比 AbstractObj 更多的東西。

將參數和返回值聲明為AbstractObj與調用您方法的人簽署的合同。不要破壞你的合同。


查看完整回答
反對 回復 2022-07-27
  • 3 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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