c# – 有没有办法在实例化对象时隐藏/显示某些方法?
发布时间:2020-12-16 00:01:41 所属栏目:百科 来源:网络整理
导读:当我编写一个迭代列表的类时会想到这个问题,方法next()和previous()会不断循环(例如,如果在最后一个对象,返回它,然后将索引重置为0) 在构造函数中,我正在考虑添加一个布尔变量,如果为true,它就像一个只有next()方法且没有循环的常规迭代器.在这种情况下,使用
当我编写一个迭代列表的类时会想到这个问题,方法next()和previous()会不断循环(例如,如果在最后一个对象,返回它,然后将索引重置为0)
在构造函数中,我正在考虑添加一个布尔变量,如果为true,它就像一个只有next()方法且没有循环的常规迭代器.在这种情况下,使用上一个()方法是没有意义的.所以我很好奇,在这种情况下是否可以隐藏previous()方法.是否有可能以某种方式在Java或C#中实现这一点? 其他语言怎么样? 解决方法
C#
可以通过使两个方法成为两个不同接口的一部分,并将对象转换为两个接口之一.例如: interface ILoopingIterator { void Next(); void Previous(); } interface INonLoopingIterator { void Next(); } class PlaysItBothWays : ILoopingIterator,INonLoopingIterator { void ILoopingIterator.Next() { this.NextCore(); } void ILoopingIterator.Previous() { // since this code will never be shared anyway,put it here } void INonLoopingIterator.Next() { this.NextCore(); } private void NextCore() { // do stuff here; this method only exists so that code can be shared } } 请注意,我已经使类明确地实现了两个接口;这样,实例的用户被迫选择他们想要使用哪个“模式”.您可以只显式地实现一个接口(提供可以更改的“默认”模式). 现在: var looping = (ILoopingIterator) new PlaysItBothWays(); // selects mode A var nonLooping = (INonLoopingIterator) new PlaysItBothWays(); // selects mode B 当然,如果他们愿意,这并不会阻止任何人将实例转换为“其他”接口,但如果程序员想要破坏他们自己的代码,他们也可以使用允许更多的反射. Java的 在Java中,以上是不可能的.您可以通过让类公开返回两个接口之一的实例的方法,并使用返回的值来实现.当然,对象实际上是工厂而不是服务提供商,所以这就像是在欺骗这个问题. class PlaysItBothWays { public ILoopingIterator asLooping() { return /* something */ } public INonLoopingIterator asNonLooping() { return /* something else */ } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |