2017-06-29 5 views
-1

"0"、 "brown"、 ".5m"、または "50cm"の文字列入力があるとします。dogクラスのdogインスタンスを作成します。これはpetクラスの子です。しかし、petクラスは、horsepigbirdのスーパークラスです。サブクラス間の変数を比較して作成する方法を教えてください。 Java

public class Pet { 
    public final String[] attribs; 
    public void sound() { 
     System.out.print(attribs[4]); 
    } 
} 

public class Dog extends pet { 
    public final String[] attribs = {"0","brown",".5m","50cm","wow"}; 
} 

public class Bird extends pet { 
    public final String[] attribs = {"1","green",".3m","30cm","hola"}; 
} 

public class Pig extends pet { 
    public final String[] attribs = {"2","pink",".7m","75cm","oing"}; 
} 

public class Horse extends pet { 
    public final String[] attribs = {"3","black","1.5m","150cm","burf"}; 
} 

public class app { 
    public static void main(String[] arg) { 
     Scanner inputs = new Scanner(System.in); 
     String AttribInserted; 
     Pet FindedPet; 
     System.out.println("type an attribute of your pet") 
     AttribInserted = inputs.nextLine(); 
     for(int i = 0; i < 4;i++) 
      if (l.equals(dog.atbts[i])) FindedPet = new dog(); 
     for(int i = 0; i < 4;i++) 
      if (l.equals(bird.atbts[i])) FindedPet = new bird(); 
     for(int i = 0; i < 4;i++) 
      if (l.equals(horse.atbts[i])) FindedPet = new horse(); 
     for(int i = 0; i < 4;i++) 
      if (l.equals(pig.atbts[i])) FindedPet = new pig(); 
     System.out.print("Your pet says:"); 
     FindedPet.sound(); 
    } 
} 

私はペットの複数のサブクラスを追加し、私は皆のための属性を追加する場合まあ、すべてのサブクラスのすべての変数の間で比較する方法があります?。例: l.equals(subclass.atbts[i]) もっと複雑なプロジェクトを使用したい場合は、ほとんどの場合です。 subclass.atbts[i][j][k]

+1

:あなたのメインロジック(私はそれWordRepositoryのような別のクラスになるだろうが)で

class Word { Collection<String> getVariations(); } class Verb extends Word { private String present; //.... public Verb(String present, String past, String participle, String continuous) { this.present = present; //.... } } 

Java命名規則'l'はドキュメンテーションが特に使用することを警告する識別子です。型名は大文字で始まる必要があります。 'dog.atbts'などがコンパイルされないことに気がつきましたか?また、 'if'とループ本体の中に中括弧(' {'、'} ')を置くことはまったく無視されています。 –

+2

@LewBloch * 'l'はドキュメンテーションが特に警告する識別子です。*ソースはありますか? – shmosel

+0

私ははしごに慣れていますが、慣習のない言葉で始まり、私はコースを取らないので、私は必要なところから読んでいます。Javaの命名規則はわかりません。また、この質問は私のプロジェクトの引用ではなく、わかりやすく、より有用になるのは粗い一般的な例です。私は決してこのコードを使用していない、私はそれをコンパイルしていない。 –

答えて

0

属性については、Map<String, Object>はどうですか。キーは属性の名前であり、値はもちろん属性の値になります。このMapはPet内のフィールドであるため、すべてのサブクラスで使用できます。

+0

私は理解していないのか分からないが、何のために属性の名前が必要なのだろうか?属性の基底にインスタンスを作成し、作成するクラスを選択する必要があります。さて、ペットクラスでは、変数にサブクラスとその属性をマップすることができます(違いがあるかどうかわからないので変数を使用します)。しかし、マップは2つのスペース/カラムだけのテーブルですか、それとも展開できますか? –

0

まず、コードをきれいで読みやすい方法で記述し、適切な命名規則に従ってください。クラスdogDogでなければなりません。atbtsはどんな単語の共通の略語でもありません。私はattributesを意味すると思いますか?

第2に、設計は単に非合理的です。

これらはペットの「属性」ではありません。あなたは単にそれをペットタイプの「エイリアス」と考えるかもしれません。しかし、私はどのように50cmが犬のエイリアスとして扱われるのか見ていません。犬は様々なサイズにすることができ、サイズが50cmのペットがいます。そのような基本的な設計上の考察がなければ、「より複雑なプロジェクト」について話すことは無意味です。あなたの宿題を間違って読んでしまったと思われます。

はしかし、あなたの本来の意図に基づいて、設計はまだもう少し意味のある形で微調整することができます。

// pseudo-code 

class Pet { 
    protected String sound; // these are what we called ATTRIBUTE! 
    protected long size; 
    // some other attributes too 

    public Pet(long size, String sound /*other attributes too*/) { 
     this.size = size; 
     .... 
    } 

    void makeSound() { 
     print this.sound; 
    } 
} 

class Dog { 
    long DEFAULT_SIZE = 50; 
    long DEFAULT_SOUND = "woof"; 
    public Dog() { 
     super(DEFAULT_SIZE, DEFAULT_SOUND); 
    } 
    public static boolean hasAlias(String input) { 
     // you can think of a way to check if input is an alias by, 
     // for example, having a Set<String> which contains 
     // DEFAULT_SIZE, DEFAULT_SOUND, pet name, sequence etc, 
     // and simply do a aliases.contains(input); 
} 

// in main logic 
String input = readInput(); 

// the following piece can be further refactored by having 
// a factory, and each pet type register their alias etc... 
if (Dog.hasAlias(input)) { 
    pet = new Dog(); 
} else if Cat.hasAlias(input)) { 
    pet = new Cat(); 
} 

アップデート:このコメントに与えられた特別な情報で

答えは、ここに更新されたアプローチです。

私の本来の意図は、本当にfuntional動物クラスを作成していない私の 意図はI入力何かで、アプリが は私がアプリは「食べた」を教えて必要な「食べた」と入力した場合、私は、話している知っています過去にあり、その 不定形は「食べる」。私が読んタイプならば、アプリが を教えてください「をお読み」過去、過去分詞と存在しており、その不定詞形 は「読むために」

まず、あなたがそれぞれの「ワード」などを表すべきではないです別のクラス。あなたの例では、eatreadは別のクラスではなく、何かのインスタンスにする必要があります。

それはのようになりますのために:従ってください

class WordRepository { 
    private Map<String, Word> wordVariationMap = new HashMap<>(); 

    void registerWord(Word word) { 
     for (String variation: word.getVariations()) { 
      wordVariationMap.put(variation, word); 
     } 
    } 

    void mainLogic() { 
     // create words and setup the lookup map 
     registerWord(new Verb("eat", "ate", "eaten", "eating")); 
     registerWord(new Verb("read", "read", "read", "reading")); 

     String input = readInput(); 
    Word word = wordVariationMap.get(input); 
    if (word) { // if found 
     word.doWhatever(); 
    } 
} 

}

+0

私のオリジナルの意図は本当にfuntional動物のクラスを作っていない、私の意図は私が何かを入力して、私が話していることを知っているアプリは、私が "ate"を入力した場合私はアプリを必要とする "Ate"過去とその不定形は "食べる"。私が読んで入力すると、アプリは私に "Read"は過去にあり、過去の分詞と現在、そしてその不定形は "読む"と伝えます。 –

+0

また、 'String input = readInput();の後の最後のコードは、私が避けたいのとまったく同じです。私が100のクラスを持っていたら、if if Statementが必要です。 –

+0

あなたがしようとしていることを明確にしてください。あなたが本当の質問から他のものをそらすことがないように、意味のある例を与えてください。 Btwは、あなたがコメントで言及したものであっても、 'eat'と' read'のために別のクラスを作るのはまだ意味がありません。とにかく、コメント –

関連する問題