簡體   English   中英

java繼承:區分繼承類的類型

[英]java inheritance: distinguish between types of inherited classes

我有一個名為A的抽象類,以及兩個繼承的類: BC 我有一個帶有參數的方法:

myMethod (final A a)

我想就實例化對象的類型做出不同的事情。 我該怎么做?

一個好的選擇是遵循另一種設計模式,但是現在不允許更改我的代碼。

謝謝。

使用instanceof關鍵字。 例如:

if (a instanceof B) {...}
else if (a instanceof C) {...}
else {...}

使用instanceof運算符:

myMethod (final A a) {
  if(a instanceof B) {
    //...
  } else if(a instanceof C) {
    //...
  } else {
    throw new IllegalArgumentException("Unknown type: " + a);
  }
}

但是請記住,按照所有面向對象的原則,這是一種糟糕的做法。

可以像其他人建議的那樣使用instanceof運算符,如果這是一個僅由您自己從事的小項目,那可能很好。

鑒於您聲明無法重構(?), 另一個可怕的選擇是添加一個返回類型的抽象方法。

即添加以下內容到A:

public abstract Type getType();

public enum Type
{
    B, C;
}

然后在B和C中實施它。

例如在B:

@Override
public Type getType()
{
    return B;
}

最后,您可以在采用A的方法中使用它:

例如

public void myMethod(final A a)
{
    if (a.getType() == Type.B)
        doSomething();
    else
        doSomethingElse();
}

注意:以上是我個人不會使用的不良解決方案,但我認為它比使用instanceof 稍好

  • 使用instanceof時,您需要注意檢查的順序
  • 如果添加A的另一個子類,則不必神奇地記住您有一些不好的代碼來檢查instanceof隱藏在某個地方的instanceof (它跳出來並向您打臉)
  • 如果添加子類D,則此解決方案可讓您(輕松)將D類似於B或C

但是,它仍然很可怕,因此,簡而言之,請盡可能地重構以避免這種情況。

暫無
暫無

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

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