假设我有以下一组接口……
public interface IStart
{
void M1();
bool IsWorking { get; }
}
public interface IStartStop : IStart
{
void M2();
event EventHandler DoM1;
event EventHandler DoM2;
}
public interface IPreferencesReader : IStartStop, IDisposable
{
string CustomColumnDefinition {get;}
bool UsePricelevelDetection {get;}
void InitializePreferences();
}现在,如果我想实现IPreferencesReader,我的类将如下所示。这是一个fat接口的示例,在这里我必须提供在所有scenarious中可能不需要的方法的实现。
public class PreferencesReaderBase : IPreferencesReader
{
public void M1()
{
throw new NotImplementedException();
}
public bool IsWorking
{
get { throw new NotImplementedException(); }
}
public void M2()
{
throw new NotImplementedException();
}
public event EventHandler DoM1;
public event EventHandler DoM2;
public void Dispose()
{
throw new NotImplementedException();
}
public string CustomColumnDefinition
{
get { throw new NotImplementedException(); }
}
public bool UsePricelevelDetection
{
get { throw new NotImplementedException(); }
}
public void InitializePreferences()
{
DoSomeInitialization();
}
}我可以为这个场景应用任何模式来重构它吗?
编辑:我不能没有这个层次结构,因为在不能删除任何接口。
感谢您的关注。
发布于 2010-06-25 21:32:40
使用“适配器”模式--而不是维基百科定义的one,所以我的术语可能是非标准的--但就像Java的MouseAdapter一样
是用于接收鼠标事件的抽象适配器类。该类中的方法为空。这个类的存在是为了方便创建侦听器对象。
..。
扩展该类以创建一个MouseEvent侦听器并覆盖感兴趣的事件的方法。(如果实现MouseListener接口,则必须定义其中的所有方法。这个抽象类为它们定义了null方法,因此您只能为您关心的事件定义方法。)
只需编写一个包含所有必要接口的空实现的抽象类;继承它并覆盖与您的需求相关的方法。
完整的fat接口仍然存在;它仍然由您的类实现(通过继承)-但是您的类的代码将只包含重要的内容。
发布于 2010-06-24 22:18:21
您不一定需要提供工作实现。在您的示例中,您的IPreferencesReader看起来不需要IStartStop,所以您可以简单地删除它吗?
如果你想从一个实现类型中隐藏一个接口方法(即,你不会在PreferencesReaderBase对象上看到它),你可以显式地实现接口:
void IStart.Start() { }然后,您将只能通过将PreferencesReaderBase引用强制转换为IStart引用来调用这些接口方法。
发布于 2010-06-25 19:10:15
我认为你需要研究一下为什么你不能打破你的界面层级结构。您说继承是必要的,但是有些类不需要实现所有的方法。这意味着世袭制度不应该是必要的!
如果IPreferencesReader不需要实现M1方法,那么它实际上就不是IStart。它正在签订的合同是无效的。
请记住,类可以继承多个接口。假设您打破了继承层次结构,那么如果PreferencesReaderBase只做IStop而不做IStart,那么您可以将其声明为:
public class PreferencesReaderBase : IPreferencesReader, IStop如果由于某种原因,你真的不能拆分这个接口,你可以考虑拆分实现类。
class Start
{
M1()
{
}
}
class Stop
{
M2()
{
}
}
public class PreferencesReaderBase : IPreferencesReader
{
private Start start = new Start();
private Stop stop = new Stop()
public void M1()
{
this.start.M1();
}
public void M2()
{
this.stop.M2();
}
}这至少会保持主要功能类的整洁。每个类做一件事,所以Single Responsibility Principle是被维护的。
然后,fat接口类只是一个骨架类,可以在整个开发迭代过程中保持基本不变。
https://stackoverflow.com/questions/3110752
复制相似问题