首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重构fat接口?

如何重构fat接口?
EN

Stack Overflow用户
提问于 2010-06-24 22:14:22
回答 3查看 835关注 0票数 4

假设我有以下一组接口……

代码语言:javascript
复制
 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中可能不需要的方法的实现。

代码语言:javascript
复制
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();
        }
    }

我可以为这个场景应用任何模式来重构它吗?

编辑:我不能没有这个层次结构,因为在不能删除任何接口。

感谢您的关注。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-25 21:32:40

使用“适配器”模式--而不是维基百科定义的one,所以我的术语可能是非标准的--但就像Java的MouseAdapter一样

是用于接收鼠标事件的抽象适配器类。该类中的方法为空。这个类的存在是为了方便创建侦听器对象。

..。

扩展该类以创建一个MouseEvent侦听器并覆盖感兴趣的事件的方法。(如果实现MouseListener接口,则必须定义其中的所有方法。这个抽象类为它们定义了null方法,因此您只能为您关心的事件定义方法。)

只需编写一个包含所有必要接口的空实现的抽象类;继承它并覆盖与您的需求相关的方法。

完整的fat接口仍然存在;它仍然由您的类实现(通过继承)-但是您的类的代码将只包含重要的内容。

票数 1
EN

Stack Overflow用户

发布于 2010-06-24 22:18:21

您不一定需要提供工作实现。在您的示例中,您的IPreferencesReader看起来不需要IStartStop,所以您可以简单地删除它吗?

如果你想从一个实现类型中隐藏一个接口方法(即,你不会在PreferencesReaderBase对象上看到它),你可以显式地实现接口:

代码语言:javascript
复制
void IStart.Start() { }

然后,您将只能通过将PreferencesReaderBase引用强制转换为IStart引用来调用这些接口方法。

票数 2
EN

Stack Overflow用户

发布于 2010-06-25 19:10:15

我认为你需要研究一下为什么你不能打破你的界面层级结构。您说继承是必要的,但是有些类不需要实现所有的方法。这意味着世袭制度不应该是必要的!

如果IPreferencesReader不需要实现M1方法,那么它实际上就不是IStart。它正在签订的合同是无效的。

请记住,类可以继承多个接口。假设您打破了继承层次结构,那么如果PreferencesReaderBase只做IStop而不做IStart,那么您可以将其声明为:

代码语言:javascript
复制
public class PreferencesReaderBase : IPreferencesReader, IStop

如果由于某种原因,你真的不能拆分这个接口,你可以考虑拆分实现类。

代码语言:javascript
复制
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接口类只是一个骨架类,可以在整个开发迭代过程中保持基本不变。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3110752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档