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); } } 助手类不需要是静态的:如果你的共享方法需要状态,你可以让你的帮助器成为一个普通的类,并在你想要共享代码的界面的每个实现中放置一个实例. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |