-1

少し問題があります。宿題では、画面上のPoint classを表す を作成して実装する必要があります。ウィンドウの特定の場所に文字「 * 」をマークする必要があります。たとえば、ページの幅は 80 ピクセル、高さは最大 49 ピクセルにする必要があります。代入者にもヒントがあり、 でメソッドを探す必要があると書かれています。pointconsoleconsoleconsoleConsole.SetCursorPosition()MSDN

それで、私はどこまで来たのですか?さて、私はclass呼び出された「ポイント」intを作成し、コーディネーター用に 2 つの変数 x と y を宣言し、コンストラクターを作成しました。しかし、コンストラクターがこれらの 2 つの変数を引数として受け取る必要があるかどうか、およびそれらをどう処理する必要があるかはわかりません。

注: このコード全体を書いてもらいたくありません。それは私が学ぶ方法ではありません。私がここに書いているのはC#、私よりも多くの経験を持つ人々が私を正しい道に導くのを助けることができるようにするためです.

4

4 に答える 4

1

IMO 位置を表すクラスは不変の値オブジェクトである必要があるため、値のセマンティクスを取得する必要があります。

私がすること:

  • クラスを作成するConsolePoint
  • private readonly int座標の値を格納するフィールドが必要です
  • getter がフィールドの値を返す 2 つのパブリック プロパティがあり、setter はありません
  • 2 つの座標を取り、ArgumentOutOfRangeExceptionそれらが無効な場合はスローしてからフィールドに代入するコンストラクターがあります。

次に、値の等価性を実装するには:

  • オーバーライドEqualsしてGetHashCode
  • オーバーロード==!=.

これらの 4 つすべてが一貫している必要があります。


しかし、変更可能なクラスを好む場合は、2 つの変更可能なフィールドと、セッターが座標を検証する 2 つのプロパティを作成します。2 つの座標の検証は独立しているため、これはうまく機能します。その場合、デフォルトのコンストラクターを使用します。

于 2013-02-02T15:03:48.073 に答える
0

多くの可能性があります。これを行う1つの方法は、2つのフィールドに対応し、xクラスyにある2つのパラメーターを受け取るコンストラクターを作成することです。次に、コンストラクター "body"は、最初のパラメーターをxに、2番目のパラメーターをに割り当てる必要がありますy

コンストラクターパラメーターにフィールドとまったく同じ名前を付けることを選択した場合、識別子はフィールドでxはなくパラメーターを参照することに注意してください。その場合this.x、フィールドを参照するために書き込む必要があります。

于 2013-02-02T15:10:32.680 に答える
0

一般的に、あなたは宗教的な熱意を持って議論されることがある領域に出くわしています。コンストラクターが常に有効で使用可能なオブジェクトを生成するか、例外をスローする、1 フェーズの初期化プロセスを支持する人もいます。2 番目のアイデアは、コンストラクターが「空の」オブジェクトを提供し、init()後でメソッドなどを呼び出すことです。オブジェクトは、コンストラクターによって指定されたとおりには使用できません。これは、2 フェーズの初期化と呼ばれます。

私はたまたま中間層のどこかにいますが、1 フェーズの初期化に傾いています。2 フェーズの初期化には用途がある場合がありますが、ほとんどの場合、IMO にはありません。他の答えはPoint、不変オブジェクトを作成することを提案しています。この場合、コンストラクターで初期化する必要があります。

オブジェクトを不変にすることとは別に、コンストラクターで初期化しない正当な理由がない場合はそうしないでください。構築時に値を初期化しない場合は、初期化する前にクラスの使用を検出する必要があります (少なくとも、将来のエラーを防ぐために)、それによる利点はありません。

コンストラクターがすべきこと: 最大値/最小値に対して値をチェックし、フィールドを初期化します。範囲外の場合は、例外をスローします。オブジェクトが変更可能な場合は、set メソッドで同じことを行うことを忘れないでください。

この場合、 CodesInChaos が回答で説明しているように、プロパティを使用してクラスを不変にすることを検討してください。

于 2013-02-02T14:56:53.853 に答える
0

あなたはConsole.SetCursorPositionメソッドに誘導されたと言いました-そのページ、特に例のセクションはあなたにとって非常に役立つはずです.

クラスに関しては、コードを投稿した方がアドバイスが簡単になります。C# でクラスのインスタンスに変数を設定するには、いくつかの一般的な方法があります。変数がfieldsの場合は、コンストラクターに値を渡してコンストラクターに代入を行わせるか、プロパティの場合は直接設定するだけです。

于 2013-02-02T14:50:58.333 に答える