【发布时间】:2015-01-30 06:09:29
【问题描述】:
public interface IBlackBox<T> {
bool IsValid();
T GetValue();
}
public abstract class Box<T>:IBlackBox<T> {
public bool IsValid() {
return true;
}
public abstract T GetValue();
}
Box 按需生成值;可以是按需计算,也可以是随机的,或者只是一个花哨的可空值等。BlackBox 做同样的事情,只是它可能会过期或变得无效。 Boxes 需要适合 BlackBox 列表(并且强调不是相反的),这决定了继承层次结构。
我不喜欢Box 是一个抽象类而不是一个接口。这引起了两个头痛。首先,这意味着我无法派生struct,这对于仅包含静态值的Box 来说是非常可取的。
第二,这意味着我不能继承任何其他东西。例如,一个预期用途是Dictionary<string,BlackBox<int>>,它本身就是Box,并根据需要对其值求和。没有充分的理由不应该只是子类Dictionary,至少有一个很好的理由应该是:不逐行包装IDictionary 接口!但有些地方我需要Box 的有效性保证,而且似乎我只能拥有其中一个。
我可以有一个interface IBox<T> : IBlackBox<T>,它是空的,仅用作“相信我”标签。这意味着在每个实现IBox<T> 的类中复制Box 的单行IsValid(),但这比手工包装IDictionary 的麻烦要少得多。不过,我希望有一个更具体的解决方案。
【问题讨论】:
-
所以,tl;dr:你不想在每个实现
IBlackBox的类中重新实现IsValid吗?注意:最好将您的问题分成两部分:问题和细节;我刚醒来,很难看到你要来的地方:p -
澄清:必须有一个离散的 Box 类型以保证结果。一个盒子必须是一个黑盒子,一个黑盒子不能是一个盒子。我真正想要的是 Box 是一个 IBox 接口,所以我可以选择继承其他类或 makgin 结构。
-
“必须有一个离散的 Box 类型以保证结果” - a) 请在问题本身中进行说明,而不是在 cmets 中,b) 请更准确地解释此要求。 为什么这很重要?请显示一些代码,您可以利用
Box<T>的优势,保证IsValid()方法始终返回true。 -
我一直在重新阅读这个问题并回到它,感觉就像你所说的那样,继承是错误的方式。也许如果你翻转它,然后有一个单独的界面,它只是作为绝对填充的盒子的标记。如果您需要明确填充的框,则要求标记界面 - 否则,您有一组
IBoxs 并且您确定它们的 either 实际上具有标记界面 或者它们可以转换为IBlackBox,然后你可以使用IsValid方法。这对你有用吗? -
我担心你在结构中实现接口的想法会得到一点好处(如果有的话)并且可能会遇到一些其他问题:blogs.msdn.com/b/abhinaba/archive/2005/10/05/477238.aspx
标签: c# inheritance interface abstract-class