加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何避免重复的接口代码?

发布时间:2020-12-15 17:42:32 所属栏目:百科 来源:网络整理
导读:由于接口不能包含实现,这似乎在导致从接口继承的类中的代码重复.在下面的例子中,假设,假设从Stream中读取的前10行或以上行被重复.尽量不要专注于这里的措辞,而是专注于在每个类之间创建重复代码的简单方法. 例如: public interface IDatabaseProcessor{ voi
由于接口不能包含实现,这似乎在导致从接口继承的类中的代码重复.在下面的例子中,假设,假设从Stream中读取的前10行或以上行被重复.尽量不要专注于这里的措辞,而是专注于在每个类之间创建重复代码的简单方法.

例如:

public interface IDatabaseProcessor
{
   void ProcessData(Stream stream);
}
public class SqlServerProcessor : IDatabaseProcessor
{
    void ProcessData(Stream stream)
    {
      // setting up logic to read the stream is duplicated code
    }
}
public class DB2Processor : IDatabaseProcessor
{
    void ProcessData(Stream stream)
    {
      // setting up logic to read the stream is duplicated code
    }
}

我意识到使用ProcessData的抽象基类并添加非抽象成员是一个解决方案.但是,如果我真的想真的要使用一个界面呢?

解决方法

跨接口共享代码的最佳方法是通过无状态扩展方法.您可以一次构建这些扩展,并在实现接口的所有类中使用它,而不管它们的继承链.这是.NET对IEnumerable< T>在LINQ中,取得了令人印象深刻的成果.这个解决方案并不总是可行的,但你应该喜欢它.

分享逻辑的另一种方法是创建一个内部的“助手”类.这在您的情况下看起来是正确的选择:实现可以将内部共享代码调用为助手的方法,而不需要复制任何代码.例如:

internal static class SqlProcessorHelper {
    public void StreamSetup(Stream toSetUp) {
        // Shared code to prepare the stream
    }
}
public class SqlServerProcessor : IDatabaseProcessor {
    void ProcessData(Stream stream) {
        SqlProcessorHelper.StreamSetup(stream);
    }
}
public class DB2Processor : IDatabaseProcessor {
    void ProcessData(Stream stream) {
        SqlProcessorHelper.StreamSetup(stream);
    }
}

助手类不需要是静态的:如果你的共享方法需要状态,你可以让你的帮助器成为一个普通的类,并在你想要共享代码的界面的每个实现中放置一个实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读