我相信這是重複的,但我不確定我在尋找正確的答案。或理解它回答我的問題。 對於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