该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/957 访问。
我们在很多开源框架中会经常看到protected virtual标记的方法,那么为什么要使用这2个关键字呢?
1、使用protected访问修饰符标记的方法或字段,只能在当前类及其子类中使用,有效的防止了外部无意的更改,使得整个框架可靠性更高;
2、使用virtual标记的方法称为虚方法,虚方法可以由设计人员自行决定是否包含方法的实现,配合protected保护特定的方法并且在其子类中可根据业务需求决定是否重写。
public class Configuration {
protected virtual void OnConfigure(Setting setting) {
Console.WriteLine("Configuration.OnConfigure");
}
public void InitXml() {
OnConfigure(new Setting());
}
}
Configuration类包含OnConfigure方法和初始化Xml方法,初始化方法中调用OnConfigure方法,由里氏替换原则可知,运行时子类对象覆盖父类,即Configuration类的子类的OnConfigure方法会被执行。当然,这取决于设计者是否重写OnConfigure方法。
public class XmlConfiguration : Configuration {
protected override void OnConfigure(Setting setting) {
//base.OnConfigure(setting);
setting.Timeout = 60;
Console.WriteLine($"{setting.PageCount}");
Console.WriteLine("XmlConfiguration.OnConfigure");
}
}
继承自Configuration类的XmlConfiguration类并重写OnConfigure方法。在OnConfigure方法中由于父类传递了Setting类型的参数,子类有办法直接访问此处与设置相关的值。本案例更改了超时Timeout并打印出分页PageCount的值。
public class Setting {
public int Timeout { get; set; } = 30;
public int PageCount { get; set; } = 20;
}
跟设置有关的类,包含超时时间和分页数量。此处根据实际开发需要决定是否限制setter访问器的使用权限。例如:
public int Timeout { get; private set; } = 30;
public class Program {
public static void Main(string[] args) {
Configuration configuration = new XmlConfiguration();
configuration.InitXml();
Console.ReadKey();
}
}
以上是调用方的代码示例,以下是这个案例的输出结果:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/957 访问。
20
XmlConfiguration.OnConfigure
Hello World!
protected和virtual联合使用,配合注入容器,会给大型项目带来巨大便利的同时提高了可靠性。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章