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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)