C#开发笔记之01-为什么开源框架会大量的使用protected virtual?

C#开发笔记之01-为什么开源框架会大量的使用protected virtual?

C#开发笔记概述

文章目录

概述

我们在很多开源框架中会经常看到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();
    }

}

以上是调用方的代码示例,以下是这个案例的输出结果:

20
XmlConfiguration.OnConfigure
Hello World!

protected和virtual联合使用,配合注入容器,会给大型项目带来巨大便利的同时提高了可靠性。

本文由 .Net中文网 原创发布,欢迎大家踊跃转载。

转载请注明本文地址:https://www.byteflying.com/archives/957

发表评论

登录后才能评论