如何在C#中向同签名函数传递派生类实例?
解决方案
因为C#支持多态特性,派生类对象可以隐式转换为基类类型,所以你完全不需要修改现有方法的参数,直接将派生类的实例集合传递给MatchKeywordToRule方法即可。
具体实现方式
1. 合并多个派生类集合传入
如果需要同时传入Sample1SmartSuggestionRule和Sample2SmartSuggestionRule的实例,只需将它们转换为基类集合后合并即可:
// 初始化Sample1的规则集合 var sample1Rules = new List<Sample1SmartSuggestionRule> { new Sample1SmartSuggestionRule { KeywordRules = "test|demo" }, // 更多实例 }; // 初始化Sample2的规则集合 var sample2Rules = new List<Sample2SmartSuggestionRule> { new Sample2SmartSuggestionRule { KeywordRules = "sample|example" }, // 更多实例 }; // 合并为基类的IEnumerable集合 var allRules = sample1Rules.Cast<SmartSuggestionRule>().Concat(sample2Rules.Cast<SmartSuggestionRule>()); string targetKeywords = "test sample"; var matchedRules = MatchKeywordToRule(ref targetKeywords, allRules);
2. 单独传递单个派生类集合
如果只需要传递某一类派生类的集合,直接转换后传入即可:
var sampleRules = new List<Sample1SmartSuggestionRule>(); string targetKeywords = ""; // 转换为基类的IEnumerable后传入 var result = MatchKeywordToRule(ref targetKeywords, sampleRules.Cast<SmartSuggestionRule>());
3. 利用泛型协变简化传递
C# 4.0及以上版本中,IEnumerable<T>支持泛型协变,如果你的派生类集合本身是IEnumerable<SampleXSmartSuggestionRule>类型,可以直接隐式转换为IEnumerable<SmartSuggestionRule>,无需手动Cast:
IEnumerable<Sample1SmartSuggestionRule> sampleRules = new List<Sample1SmartSuggestionRule>(); string targetKeywords = ""; // 直接传入即可,编译器会自动处理类型转换 var result = MatchKeywordToRule(ref targetKeywords, sampleRules);
原理说明
派生类继承基类后,其实例天然兼容基类类型——这是面向对象多态的核心特性之一。你的方法仅使用基类的KeywordRules属性,完全不需要关心具体是哪个派生类的实例,因此这种传递方式既安全又符合面向对象的设计原则。
内容的提问来源于stack exchange,提问作者Humza Munir
相关产品推荐
相关产品推荐

