ram*_*ram 14 c# inheritance abstract-class overriding access-modifiers
我今天正在进行一些代码审查,并遇到了一些开发人员编写的旧代码.它就是这样的
public abstract class BaseControl
{
internal abstract void DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
如果在同一个程序集中有派生类,它就可以工作
public class DerivedControl : BaseControl
{
internal override void DoSomething()
{
}
}
Run Code Online (Sandbox Code Playgroud)
但是在不同的程序集中派生基类会产生编译时错误
DerivedControl does not implement inherited abstract member 'BaseControl.DoSomething()
Run Code Online (Sandbox Code Playgroud)
这让我思考.为什么有人会将方法声明为内部抽象?
一个明显的情况是该方法接收或返回内部类型.例如,WPF转换类的核心方法处理一些内部互操作类型,WPF不会将其作为其公共API的一部分公开.由于签名包含内部类型,因此该方法不能公开或受保护.但显然,各种Transform类以多态方式工作是合适的(必要的!).因此,Transform/GeneralTransform中的基本方法必须是内部的.
另一个但相关的原因是防止外部推导.毕竟,WPF架构师可以在受保护的抽象方法中公开内部互操作类型的"安全"版本,以便用户可以创建自己的Transform类.他们之所以没有,是因为他们不想应对人们使用这种能力的方式,例如创造非仿射变换.允许外部派生会使WPF中其他类的工作变得非常复杂,因此架构师决定通过在内部创建抽象方法来仅允许"已批准"的派生类.
| 归档时间: |
|
| 查看次数: |
3541 次 |
| 最近记录: |