これは重複していると確信していますが、私は正しい答えを探していますか分かりません。またはそれが私の質問に答えることを理解する。 1の場合、私のインターフェースを間違って使用していると思います。 1のために私はSOLIDのルールを破り、それをきれいにしようとしています。たとえば、IReelWindow
です。私はReelWindowTumble
に固有のものがありますが、他のReelWindows
は実装されていないエラーを投げないでください。私はそれを複数のインターフェイスに分割し始めましたが、ITumble
の新しいインターフェイスを作成してもまだIReelWindow
から継承していても、私はもはやReelWindowTumble
の関数にアクセスできませんでした。問題は機能コードにあります。ここで渡す一般的な型を実装してください
public interface IReelWindow
{
//stuff declared
void PopulateWindowTumble();
void PopulateWindow(int[] currentStops);
}
public class ReelWindow : IReelWindow
{
// implements most of it throwing exceptions when I don't use it.
public void PopulateWindow(int[] currentStops)
{
}
public void PopulateWindowTumble()
{
throw new NotImplementedException();
}
}
public class ReelWindowTumble : IReelWindow
{
// implements most of it throwing exceptions when I don't use it.
public void PopulateWindow(int[] currentStops)
{
}
void PopulateWindowTumble()
{
}
}
public class ReelWindowIndependent : IReelWindow
{
// implements most of it throwing exceptions when I don't use it.
public void PopulateWindow(int[] currentStops)
{
}
public void PopulateWindowTumble()
{
throw new NotImplementedException();
}
}
私は新しいIReelWindow
を宣言し、クライアントの入力に基づいて新しいReelWindow
を作成します。これは、ReelWindowを使用したいところのどこでもIReelWindow
を渡すだけで、うまくいきます。 これは私のインターフェイスの適切な使い方ではないと思います。 ICloneable
を使用する場合、私はICloneable
という新しいオブジェクトを宣言せず、それを渡します。 しかし私の意図はGeneric ReelWindow
タイプを作成することです。クライアントが作成するウィンドウのタイプは気にしません。私はちょうど私がそれらを具体的に使用するときにどのような機能を持つべきかを強制したい。
同一の強力な型が渡された複数の関数を作成せずに渡すことができる汎用のReelWindow
を宣言するにはどうすればよいですか?
public static IReelWindow CreateReelWindow(WindowType userSelectedWindowType, Paytable paytable)
{
IReelWindow _reelWindow;
if (userSelectedWindowType == WindowType.Standard)
{
_reelWindow = new ReelWindow(paytable.ColLengths, paytable.ReelContainer.Reels, paytable.WindowWidth, paytable.Lineset, paytable.ReelContainer.TotalPhysicalReelStop);
}
else if (userSelectedWindowType == WindowType.Tumble)
{
_reelWindow = new ReelWindowTumble(paytable.ColLengths, paytable.ReelContainer.Reels, paytable.WindowWidth, paytable.Lineset, paytable.ReelContainer.TotalPhysicalReelStop);
}
else if (userSelectedWindowType == WindowType.Independent)
{
_reelWindow = new ReelWindowIndependent(paytable.ColLengths, paytable.ReelContainer.Reels, paytable.WindowWidth, paytable.Lineset, paytable.ReelContainer.TotalPhysicalReelStop, paytable.ReelLengths, paytable.ReelStarts);
}
else
throw new ApplicationException("Unknown window type selected by user. Cannot continue.");
return _reelWindow;
}
後で私のコードで私はreelwindowsを使用し、私は、関数はそれに応じて使用しますreelwindowの種類を気にしないようにのみ「IReelWindow」を渡します。
public abstract class AEval
{
public abstract double Evaluate(IReelWindow reelWindow, ref string flags, int currentStopsWeight);
public abstract double EvaluateVerbose(IReelWindow reelWindow, ref string flags, int currentStopsWeight);
}
あなたは、インターフェイスの実装からNIEを投げることはコードのにおいですが、意味のあなたの質問に答えるために、よりインタフェースの詳細、およびその使用せずにそのハードということですね。 – Jamiec