2017-04-19 68 views
0

假設用戶爲您提供了一個電話號碼(作爲類PhoneNumber的一個對象或它的一個子類),他首先聲明它是手機還是手機一個家庭電話。在主程序中,您應該能夠知道(之後的方式)是指移動電話還是家庭電話。2具有相同內容的Java類(函數,變量等)

下面是你不能做什麼:

  1. 您不能檢查數字,找出因爲用戶實際上是能夠給任何號碼,他希望(他可以給9123的室內電話)。
  2. 您不能在任何指示答案的變量(在類或主程序中)。

如果您製作兩個不同的類來擴展PhoneNumber類並且具有完全相同的內容(在我的示例中它們實際上是空的,但在我真正的問題中它們不是)?如果你這樣做,你可以創建這些類的對象,並在主程序中使用instanceof,但是我想知道是否有另一種解決方案,看起來更好。

編輯:我看起來有什麼不對,因爲我們實際上只知道找出一個對象的類,所以2個類的內容相同,而不是instanceof。

例子:

public class PhoneNumber{ 
    private int Number; 

    public PhoneNumber(int Number){ 
      this.Number = Number; 
    } 
} 

public class Mobile extends PhoneNumber{} 

public class HousePhone extends PhoneNumber{} 
+0

在此先感謝並對任何錯誤感到抱歉,這是我的第一個問題 –

+0

「您不能在任何指示答案的變量(在課程或主程序中)」。 < - 爲什麼不呢? –

+1

您可以改爲擴展'PhoneNumber'一次,然後添加一個枚舉來指示它是什麼類型的數字,例如:'public enum PhoneNumber.PhoneType {MOBILE,HOME}'並存儲它的一個成員。 – CollinD

回答

0

既然你不能創建在主程序任何變量,你的選擇是明顯有限

您可以使用OOP概念來解決這個問題,正如您嘗試的那樣。並且您不需要複製內容,因爲從已經具有所有內容的同一父節點繼承,將自動授予它們訪問內容的權限。這包括除指定爲私人的所有屬性和字段。爲了解決這個問題,你可以保護這些屬性。

以下應爲你工作:

public abstract class PhoneNumber 
{ 
    private int Number; 


    public PhoneNumber(int Number) 
    { 
     this.Number = Number; 
    } 

    protected int getNumber() 
    { 
     return Number; 
    } 

    public void doSmthnWithNumber(); 
} 

public class Mobile extends PhoneNumber 
{ 
    @Override 
    public void doSmthnWithNumber() 
    { 
     int Number = getNumber(); 
     // Do whatever you want with mobile numbers 
    } 
} 

public class HousePhone extends PhoneNumber 
{ 
    @Override 
    public void doSmthnWithNumber() 
    { 
     int Number = getNumber(); 
     // Do whatever you want with HousePhone numbers 
    } 
} 

所以用這個,你知道有一個在你的代碼沒有冗餘,你不重複自己,你是以下SOLID原則。使其更容易在眼睛上,更好地讓其他開發人員瞭解你。 也可以對PhoneNumber進行更改,它將反映在子類中。

希望我已經能夠解決您的問題。

+0

感謝您的回答。聽起來像個好主意,我會問我的老師 –

+0

@ staa99我想你忘了在方法簽名中添加關鍵字*'abstract' *。 'public void doSmthnWithNumber();' –

+0

你說得對,我忘了添加摘要。感謝您爲我指出。 – staa99

1

你不能讓任何變量(在類或在主程序),指出了答案。但是你可以製作一個獲取類型的方法。在您的課程MobileHousePhone中創建一個方法,返回某種enum。 方法應該是基類中的抽象方法。

我認爲這比instanceof更好。

+1

我的問題是那些2個課程的內容完全相同。我不知道它是否顯示爲我的程序不好。感謝您回答 –

0

替代instanceof,您可以使用isAssignableFrom

PhoneNumber phoneNum = new Mobile(123); 

    if (phoneNum.getClass().isAssignableFrom(Mobile.class)) { 
     Mobile mobile = (Mobile) phoneNum; 
    } else { 
     HousePhone housePhone = (HousePhone) phoneNum; 
    } 
+0

但是我仍然需要創建這2個相同的課程。感謝您回答 –

+0

這個解決方案最好的解決方案是什麼?如果你想要的只是'instanceof',那麼'isAssignableFrom'是一個完整的矯枉過正,在代碼上做得不那麼冗長,更復雜而沒有任何明顯的好處。你可以用'isInstance'來代替,這對於這個目的來說是完全足夠的。 – Paul

+0

也許我沒有寫那麼好。 Instanceof實際上是我們在我的課程中知道的唯一方法,可以在對象屬於特定類時回答您。對我來說有點偏離的是那些具有相同變量,函數和構造函數的類(我真正的問題當然比這個大得多) –

相關問題