我相信这是重复的,但我不确定我在寻找正确的答案。或理解它回答我的问题。 对于1我认为我使用我的界面错误。对于1我打破了固体的规则,并试图清理它。例如IReelWindow
。我在那里特定的东西ReelWindowTumble
,其他ReelWindows
不使用和抛出未实现的错误。我开始把它分解成多个接口,但发现我不再能够访问ReelWindowTumble
的功能,即使我为ITumble
创建了一个新接口,并且仍然继承了IReelWindow
。问题出在功能代码中。实现泛型类型传递
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
。这工作正常,因为我只是想通过IReelWindow
我想使用ReelWindow。 我不认为这是我的界面的正确用法。如果我使用ICloneable
,我不会声明ICloneable
的新对象并将其传递。 但我的意图是创建一个通用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,只有在“IReelWindow”通过我不在乎什么类型reelwindow的,该函数将相应地使用它。
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