したがって、基本的に2文字の配列であるabstract
クラスの一部である以下のメソッドがあります。私は、少し違う振る舞いを持ついくつかのサブクラスを持つつもりです。それは、さまざまな方法で自分自身を埋める方法を知っています。C#:このメソッドをオーバーライドする方法を構造化する方法
問題のメソッドは、文字列を配列に挿入することになっています。オーバーフローエラーを避けるために、配列に空きがあるかどうかを確認する必要があります。これが十分な部屋かどうかを確認することは簡単ですが、問題が始まる場所です。
余裕がない場合は、各サブクラスでその動作をどのように処理するかを定義する必要があります。 (例えば、いくつかのサブクラスは最初からやり直して、何もしないで文字の挿入をやめ、上の行を消去し、すべてを上に移動し、下の新しい空白行に書きます。プログラムをクラッシュさせるなど)
次のコードのコメントを参照してください。私はoverride
の実装をしたいと思うが、私はちょうどelseブランチをオーバーライドする方法があるのだろうか、またはサブクラスに全体のメソッドを移動する必要がありますか?
(IsEnoughRoom
は、クラス内のプライベートメソッドである。)
internal void InsertString(string stringToInsert, int xStart, int yStart)
{
char[] charsToInsert = stringToInsert.ToCharArray();
int currentXPosition = xStart;
int currentYPosition = yStart;
// For each character in the array of charsToInsert,
for (int i = 0; i < charsToInsert.Length; i++)
{
// Check if there is enough room...
if(isEnoughRoom(xStart, yStart, charsToInsert))
{
SetCharAt(currentXPosition, currentYPosition, charsToInsert[i]);
if (currentXPosition < xSize - 1)
{
currentXPosition++;
}
else
{
currentXPosition = 0;
currentYPosition++;
}
}
else
{
//TODO: What do we do if there isn't enough room?
}
}
なぜ、 'else'ブランチで仮想メソッドまたは抽象メソッドを呼び出さないのですか?あなたが最初からやり直す方法ははっきりしません...私の推測では、あなたがelseブランチの中でやりたいと思っていることをすべて実際に表現することはできません。 –
@JonSkeet私を訂正してくださいもし私が間違っていれば、私はそれをしたら方法の中のフィールドにアクセスすることができませんでしたか?つまり、 'currentYPosition'を' 0'に設定して最初からやり直すことはできません。それともコンセプトが欠けていますか? – Airhead
さて、メソッドを参照することによって変数を渡す可能性があります。戻り値を使用することもできます。 (または、それらをすべて単一のオブジェクトにカプセル化したいと思うかもしれません...)しかし、それは、その別の場合にその 'else'ブランチのボディがどのように見えるかを示すことが非常に役立つでしょう。 –