由于接口不能包含实现,这似乎在导致从接口继承的类中的代码重复.在下面的例子中,假设,假设从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 } }
解决方法
跨接口共享代码的最佳方法是通过无状态扩展方法.您可以一次构建这些扩展,并在实现接口的所有类中使用它,而不管它们的继承链.这是.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); } }
助手类不需要是静态的:如果你的共享方法需要状态,你可以让你的帮助器成为一个普通的类,并在你想要共享代码的界面的每个实现中放置一个实例.