【发布时间】:2014-10-09 15:02:18
【问题描述】:
我一直在阅读 Jeffrey Richter 的 CLR by C# 一书,他认为在基类中定义方法时,如果有一个方法要声明为虚拟方法并且它有一些便利重载,最复杂方法应该是虚拟方法,其他方法应该保留为非虚拟方法。这是他给出的例子:
public class Set {
private Int32 m_length = 0;
// This convenience overload is not virtual
public Int32 Find(Object value) {
return Find(value, 0, m_length);
}
// This convenience overload is not virtual
public Int32 Find(Object value, Int32 startIndex) {
return Find(value, startIndex, m_length - startIndex);
}
// The most feature-rich method is virtual and can be overridden
public virtual Int32 Find(Object value, Int32 startIndex, Int32 endIndex) {
// Actual implementation that can be overridden goes here...
}
// Other methods go here
}
这里的理性是什么?
【问题讨论】:
-
在我看来,他只是在举一个polymorphism 的例子,他的重载。至于为什么要使用
virtualthis 是一个很好的答案。 -
不,实际上这本书是关于 CLR 的。多态性在本书中被视为一个已知的概念。这实际上是一个示例,说明为什么在有许多不同的便利重载时,您应该始终只将更复杂的一个设置为虚拟,而将其余部分保留为非虚拟。
-
他说这样做会使其更具多态性?那是因为只有一种方法可以覆盖而不是很多吗?如果是这样,为什么它更具有多态性?
-
我以前从未听说过这个,但它是有道理的。我很想看到有人提出一个继承类的例子,它运行良好。
-
嗯,将所有重载设为虚拟在技术上没有任何问题,但我认为这个想法是,只有主要方法,即采用所有参数的方法,是唯一需要的方法 被覆盖。其他的只是代理到这个主要方法,转发他们的参数并为其余的传递 null 或一些默认值。无论在任何继承结构中覆盖主方法多少次,这些都将继续正常工作。
标签: c# inheritance clr virtual-functions