c# – 通用协方差和转换为SuperType

c# – 通用协方差和转换为SuperType,第1张

概述我有一个OO问题,我认为可以与Generic Covariance联系起来.我正在尝试构建一个用于导入不同类型记录的模块化系统…模块包含常用方法,而SalesModule包含处理特定逻辑的函数… public interface IImportable { ... void BuildSqlDataRecord(); ... }public class Sales : IImportable 我有一个OO问题,我认为可以与Generic Covariance联系起来.我正在尝试构建一个用于导入不同类型记录的模块化系统…模块包含常用方法,而SalesModule包含处理特定逻辑的函数…

public interface Iimportable { ... voID BuildsqlDataRecord(); ...  }public class Sales : Iimportable { ... }public interface IModule<out T> where T : Iimportable{    voID import(IEnumerable<T> List);  // Error Occurs here...    IEnumerable<T> LoadFromTextfile(TextReader sr);}public abstract class Module<T> : IModule<T> where T : Iimportable{     public voID import(IEnumerable<T> List) { ... T.BuildsqlDataRecord(); ... }     public IEnumerable<T> LoadFromTextfile(TextReader sr) { ... }}public class SalesModule : Module<Sales>{    public overrIDe voID BuildsqlDataRecord() { ... }; }

在另一个功能:

//Module<Iimportable> module = null;IModule<Iimportable> module = null;if(file.name == "SALES")    module = new SalesModule();else    module = new InventoryModule();var List = module.LoadFromTextfile(sr);module.import(List);

如何声明模块以便我可以调用重写的方法?

@R_419_6120@
public interface IModule<out T> where T : Iimportable{    voID import(IEnumerable<T> List);  // Error Occurs here...    IEnumerable<T> LoadFromTextfile(TextReader sr);}

错误是正确的.我们选择“out”作为表示协方差的关键字,提醒您T只能出现在“输出”位置.在突出显示的行中,T显示为输入.

T不能是输入,因为……好吧,假设它被允许并看到发生了什么坏事:

IModule<Giraffe> gm = GetMeAModuleOfGiraffes();IModule<Animal> am = gm; // Legal because of covariance.IEnumerable<Tiger> tigers = GetMeASequenceOfTigers();IEnumerable<Animal> animals = tigers; // Legal because of covariance.am.import(animals); // Uh oh.

您刚刚将一个老虎列表导入到一个只知道如何处理长颈鹿的模块中.

为了防止这种情况,必须使非法步骤是第一个.类型声明是非法的“out”.

How do I declare the module such that I can call the overrIDden methods?

您必须声明接口以使其遵守协方差规则.你如何做到这一点取决于你,但首先不要将任何“out”参数放入“输入”位置.

总结

以上是内存溢出为你收集整理的c# – 通用协方差和转换为SuperType全部内容,希望文章能够帮你解决c# – 通用协方差和转换为SuperType所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1223340.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存