0

単一の printf ステートメントまたは @Override toString() メソッドを使用して、参照する必要がある可能性のあるさまざまなサブクラスがある場合に正確な情報を提供する方法に興味があります。

サンプルプログラムのセットアップは次のとおりです。

class Animal - String name - int age class Bird extends Animal - private int feathers - Animal animalObj //animal オブジェクトを参照する vars class Monkey extends Animal - プライベート int weight - 動物 animalObj //animal オブジェクトを参照する vars class Tree - int heightInFeet - Animal animalInTree //インスタンス化された動物オブジェクトを参照する

クラス ツリーには「boolean inTree()」メソッドがあり、true の場合、動物がツリーにあることを意味します クラス ツリーにはさらに 2 つのメソッドがあります... public Animal nowInTree() public Animal hasLeftTree()

これらの各メソッドには、動物の特徴を一覧表示するための println または printf ステートメントも必要です...ここにキャッチがあります。Bird クラスにはパラメーター int の羽があり、Monkey クラスにはパラメーター double の重みがあります。

Tree クラスから呼び出されたコンソールへの私の出力は、次のようなものになるはずです....「912 枚の羽を持つ 3 歳の Falcon という名前の鳥が木を去りました。」

次に、同じメソッドを使用するか、おそらく同じ printf ステートメントを使用して、コンソールに出力することもできます...「ババという名前のサルは、9 歳で体重が 22.5 ポンドで、木を離れました。」

可能なprintfステートメント(作成されたスーパーおよびサブクラスメソッドを想定-これは不完全ですが=

System.out.printf("%d 歳 $s の %s という名前の動物が木を離れました", animalInTree.getAnimalName(), animalObj.getAge(), wtfGoesHere.callMeth(), );

wtfGoesHere() メソッドが表す各サブクラスから var を取得する必要があることに注意してください。wtfGoesHere() は、変数の重みやフェザーだけでなく、付加された追加情報も返す必要があります...したがって、重みだけでなく、「その重みは %d です」。

Weight と Feathers var は非公開にする必要があります。でもpublisならそれで解決するのでは?はいの場合、それはまだ危険なコーディングですか? 私はまだアマチュアですが、陰部の周りで仕事をしていると、お尻が荒れることがあります。

現在、コンパイラは Animal クラスの情報を認識していますが、Monkey と Bird のサブクラスは認識していないため、私は困惑しています。サブクラスの情報に対して getBlaBla() を作成できますが、どのクラスをいつ使用するかを Java に伝える方法がわかりません。

考えられる考え...

  1. 例外処理を行い、printf メソッドに追加のパラメーターを追加します。そのフィールドに到達すると、使用できるフィールドを使用し、別のフィールドで例外をスローします...可能であれば、まだ expcetions を知りませんが、私は上級者ですJava クラスとそれは 1 か月先です。宿題は、例外処理を許可しないことを「暗示しています」。(これが機能するかどうかは興味がありますが)

  2. どのサブクラスが必要かを決定する何らかのカスケード「if else」を作成します。私が作成する際に制限されているメソッドには、サブクラスオブジェクトを渡すことが含まれていないため、依然として問題があります... Tree クラス内で渡すオブジェクトパラメーターとして Animal クラスのみを受け入れるだけです。

  3. これを処理するには、Tree クラスの toString() オーバーライド メソッドを使用します。

  4. 私たちはabsractクラスと「implements」関数について学びました - だから、これが私の問題を解決できるなら、私はそれにもオープンです... hasLeftTree() メソッドが両方のサブクラスの可能性を処理できる限り。特に明記していない場合、hasLeftTree() メソッドは具体的に print ステートメントを呼び出し、動物の拡張情報を含むサブクラスに関するすべての情報を提供します。

私はこれにいくつかの考えを入れており、手持ちのために泣き言を言っているだけではないことを示すために上記に言及しています. また、上記の制限にもかかわらず、私の先生は...時折...クラスで特に言及されていない関数を見つけてほしいと宣言しました...だから...業界で受け入れられている適切な標準では指示を外す必要があると信じているなら私はそれを私の教授に主張します。

必要に応じて、さらにコードを提供します。他のすべては、4 つのファイル (3 つのクラスとメイン メソッド ファイル) で構成されるプログラムで機能します。

考え?と TYVM 事前にコードの神。

4

1 に答える 1

0

スーパークラスのtoStringメソッドを返すとき、ポリモーフィズムを介してjavaがサブクラスの向こうに目を向け、toStringメソッドの「より良いバージョン」があるかどうかを確認することを理解することで、これを解決しました...私のオブジェクトはサブクラスオブジェクトだったときスーパークラス toString を呼び出して、サブクラス オブジェクトを確認し、サブクラスを調べて同一のメソッドがあるかどうかを確認します...この場合は「toString」であり、見つかった場合は代わりにそのメソッドを使用します。これを行うことで、すべての適切な情報が print ステートメントなどに返されました。

于 2012-10-31T18:54:16.913 に答える