2017-04-19 24 views
0

携帯電話であるか最初に述べた電話番号(クラスPhoneNumberまたはそのサブクラスのオブジェクトとして)家の電話。メインプログラムでは、それが携帯電話または家の電話を参照する場合(後で)知ることができるはずです。ユーザが実際に彼が望んでいる任意の番号を与えることができるので、あなたが見つけるために番号を確認することはできません(彼は家の電話のために9123を与えることができる同じ内容の2つのJavaクラス(関数、変数など)

  1. そして、ここではあなたが行うことができないものです)。

  2. 答えを示す変数(クラス内またはメインプログラム内)を作成することはできません。

PhoneNumberクラスを拡張し、全く同じ内容のクラスを作成する必要があります(私の例では実際には空ですが、実際の問題ではありません)。そうすれば、それらのクラスのオブジェクトを作ることができ、instanceofをメインプログラムで使うことができますが、別の解決方法があるかどうか疑問に思います。

EDIT:実際にはオブジェクトのクラスを理解するためにしかわからないので、instanceofではなく同じ内容の2つのクラスが私にとって間違っていると思われます。

例:

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'を一度拡張して、それがどんなタイプの番号であるかを示すためにenumを追加することができます:' 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

このソリューションについてどう思いますか? 'isAssignableFrom'はあなたが望むものがすべて' instanceof'であれば完全なオーバーキルです。代わりに 'isInstance'を使うことができます。これは、この目的にはまったく十分です。 – Paul

+0

たぶん私はそれを書いていないでしょう。 Instanceofは実際に私のクラスで知っている唯一のメソッドで、オブジェクトが特定のクラスに属している場合に答えることができます。同じ変数、関数、コンストラクタを持つ2つのクラス(私の実際の問題はもちろんこれよりもはるかに大きい)は少しわかりました。 –

関連する問題