.NET Framework 4.8中如何用接口泛化不同构造参数的类构造器
.NET Framework 4.8 方法泛化实现方案
可以实现泛化,但你设想的直接通过接口实例化的思路不可行——C#接口无法定义构造函数,没法直接通过接口类型创建对象。不过有两种实用方案可以达成泛化目的:
方案一:用委托封装实例化逻辑
先定义统一接口,让Class1和Class2实现该接口:
public interface IClass { // 在此添加两个类共有的方法/属性,方便后续统一操作 } public class Class1 : IClass { public Class1(string entry, int length) { // 构造逻辑 } } public class Class2 : IClass { public Class2(string entry) { // 构造逻辑 } }
实现泛化方法,通过Func<string, IClass>委托接收不同的实例化逻辑:
private void ReadFilesCommon(List<string> input, Func<string, IClass> instanceFactory) { foreach (string entry in input) { IClass instance = instanceFactory(entry); // 此处可对所有IClass实例执行统一操作 } }
调用时传入对应类的实例化逻辑:
// 处理Class1场景 ReadFilesCommon(inputList, entry => new Class1(entry, entry.Length)); // 处理Class2场景 ReadFilesCommon(inputList, entry => new Class2(entry));
方案二:使用工厂模式
如果偏好基于接口的设计,可定义工厂接口并为每个类实现对应工厂:
public interface IClassFactory { IClass Create(string entry); } public class Class1Factory : IClassFactory { public IClass Create(string entry) { return new Class1(entry, entry.Length); } } public class Class2Factory : IClassFactory { public IClass Create(string entry) { return new Class2(entry); } }
泛化方法改为接收工厂接口:
private void ReadFilesCommon(List<string> input, IClassFactory factory) { foreach (string entry in input) { IClass instance = factory.Create(entry); // 统一操作IClass实例 } }
调用时传入对应工厂实例:
ReadFilesCommon(inputList, new Class1Factory()); ReadFilesCommon(inputList, new Class2Factory());
这两种方案都能抽离重复的遍历逻辑,同时适配两个类构造参数不同的情况。
内容的提问来源于stack exchange,提问作者Filipe
相关产品推荐
相关产品推荐

