zu übergeben Ich bin sicher, das ist doppelt, aber ich bin nicht sicher, ob ich nach den richtigen Antworten suche. Oder zu verstehen, dass es meine Frage beantwortet. Für 1 Ich denke, ich benutze meine Schnittstelle falsch. Für 1 brich ich die Regeln von SOLID und versuche, es aufzuräumen. Zum Beispiel IReelWindow
. Ich habe die Dinge in dort spezifisch ReelWindowTumble
, die andere ReelWindows
nicht verwenden und nicht implementierte Fehler werfen. Ich begann es in mehrere Schnittstellen zu brechen, aber ich fand nicht mehr Zugriff auf Funktionen für ReelWindowTumble
, obwohl ich eine neue Schnittstelle für ITumble
erstellt und immer noch geerbt von IReelWindow
. Das Problem liegt im Funktionscode.Implementieren Sie einen generischen Typ um
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();
}
}
Hier erkläre ich einen neuen IReelWindow
und einen neuen ReelWindow
Eingabe basierend auf Client erstellen. Das funktioniert ganz gut, da ich einfach IReelWindow
überall hin durchführe, wo ich ein ReelWindow benutzen möchte. Ich glaube nicht, dass dies die richtige Verwendung meiner Schnittstelle ist. Wenn ich ICloneable
verwende, deklariere ich kein neues Objekt von ICloneable
und gebe es weiter. Aber meine Absicht ist es, einen generischen ReelWindow
Typ zu erstellen. Es ist mir egal, welche Art von Fenster der Client erstellt. Ich möchte nur durchsetzen, welche Funktionen es haben sollte, wie ich sie speziell verwende.
Wie deklariere ich eine generische ReelWindow
, die ich weitergeben kann, ohne mehrere Funktionen zu erstellen, die identisch sind, aber starke Typen übergeben haben?
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;
}
Später in meinem Code verwende ich die reelwindows, und übergeben Sie nur in ‚IReelWindow‘ wie mir egal, welche Art von reelwindow, die Funktion, die sie entsprechend verwenden.
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);
}
Sie haben Recht, dass das Werfen von NIE von Schnittstellenimplementierungen ein Code-Geruch ist, aber ohne mehr Details der Schnittstelle und seiner Verwendung ist es schwierig, Ihre Frage sinnvoll zu beantworten. – Jamiec