簡體   English   中英

如何在沒有instanceof的情況下“映射”兩個不同的對象繼承樹

[英]How to "map" two different object inheritance trees without instanceof

我有一個設計問題,我找不到好的解決方案。 這是我的問題:

有兩個不同的對象“樹”需要一起處理。 對象樹一:

  • AbstractObjectTreeOneSub1ObjectTreeOneSub2ObjectTreeOne
  • AbstractObjectTreeTwoSub1ObjectTreeTwoSub2ObjectTreeTwo

我現在有一個方法可以獲取 AbstractObjectTreeOne 的列表和 AbstractObjectTreeTwo 的列表。 它們的大小完全相同,並且在名稱上彼此“匹配”。 所以我可以遍歷 AbstractObjectTreeOne 列表中的對象,並按名稱獲取相應的 AbstractObjectTreeTwo。

現在應該驗證“匹配”對象(按名稱)是否真的彼此匹配,因此當前代碼包含很多 instanceof 內容。 例子:

if (!(objectOfAbstractObjectTreeOne instanceof Sub1ObjectTreeOne)) {
   throw exception;
}

然后也用同樣的方法

if (!(objectOfAbstractObjectTreeTwo instanceof Sub1ObjectTreeTwo)) {
   throw exception;
}

之后,兩個參數都被轉換為它們的“真實”子類型以進行進一步處理。 這也感覺不是很好。

這一切都感覺不是很面向對象,但我目前不知道如何解決這個問題。 我嘗試了訪問者模式,但它只解決了 AbstractObjectTreeOne 或 AbstractObjectTreeTwo 中的 instanceof 問題,並且仍然包含很多 instanceof。

也許你們中的一些人對這類問題有一個好主意。 也許它很容易解決,但我還沒有正確的想法。

這稱為 OOO 原理 多態性

無需使用instanceof 您必須創建一個interface並在樹的聲明中使用它。 所有子類型都應該實現這個接口,你可以調用所需的方法而不需要類型轉換。

這是一個例子。

public interface ObjectTreeOne { void payloadOne() {}   }
public class Sub1ObjectTreeOne implements ObjectTreeOne {   void payloadOne() {}    }
public class Sub2ObjectTreeOne implements ObjectTreeOne {   void payloadOne() {}    }

List<ObjectTreeOne> objectTreeOne = new ArrayList<>();
objectTreeOne.add(new Sub1ObjectTreeOne()); 
objectTreeOne.add(new Sub2ObjectTreeOne());

public interface ObjectTreeTwo {    void payloadTwo() {}    }
public class Sub1ObjectTreeTwo implements ObjectTreeTwo {   void payloadTwo() {}    }
public class Sub2ObjectTreeTwo implements ObjectTreeTwo {   void payloadTwo() {}    }

List<ObjectTreeTwo> objectTreeTwo = new ArrayList<>();
objectTreeTwo.add(new Sub1ObjectTreeTwo()); 
objectTreeTwo.add(new Sub2ObjectTreeTwo());

for(int i = 0; i < 2; i++) {
    ObjectTreeOne objectTreeOne = objectTreeOne.get(i);
    ObjectTreeTwo objectTreeTwo = objectTreeTwo.get(i);
    
    objectTreeOne.payloadOne();
    objectTreeTwo.payloadTwo();
    
}

暫無
暫無

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

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