C# 夯实基础之,默认访问级别,虚方法virtual和new区别,以及抽象类abstract区别,及工作中实际应用

本文探讨了C#编程中`virtual`关键字的使用,它允许派生类重写父类方法。同时,解释了类的访问级别如`private`、`protected`和`internal`。通过示例代码展示了`new`和`override`关键字的区别,并介绍了抽象方法和虚方法的异同。文章最后结合实际项目中接口、抽象类和虚方法的应用进行了说明。
摘要由CSDN通过智能技术生成

最近学习Quratz,一个任务调度框架,查看代码发现很多地方使用virtual关键字,其实不仅如此,在C# asp.net框架里面,以及公司封装的框架,也非常多地方使用Virtual关键字,虽然工作几年

却感觉懂,又好像不懂,心中没底,因此写下这篇博文,

总结是:

虚方法标记,就是让派生类重写的,从而覆盖父方法,有点像接口的作用,

 私有就是类自己使用,

保护是继承还可以用,

内部是当前程序集,

class 默认是访问级别是内部的,成员默认私有

参考https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/accessibility-levels

示例代码 

 class ParentVitual {
        void Test0() { 

        }
        internal void Test1() {
            Test0();
            Console.WriteLine("Test1");
        }
        public virtual void Test2()
        {
            Console.WriteLine("virtual Test2");
        }
        public virtual void Test3()
        {
            Console.WriteLine("virtual Test3");
        }
    }

   class Son : ParentVitual {
        new internal void Test1()
        {
            Console.WriteLine("parent Test1");
        }
        new public  void Test2()
        {
            Console.WriteLine("parent Test2");
        }
        //只有虚方法,抽象方法才能重写
        override public void Test3()
        {
            Console.WriteLine("parent Test3");
        }
    }

控制器启用程序 

 static void Main(string[] args)
        {
            new Internal();//没写类前面访问属性,默认是内部的级别访问,即当前程序集
            //私有就是类自己使用,保护是继承还可以用,内部是当前程序集,
            ParentVitual parent = new Son();
            //没有写虚方法,仍然可以用new关键字
            parent.Test1();
            //父引用,仍然调用父类中方法,即便是虚方法
            parent.Test2();
            //所谓覆盖,可简单理解只剩下一个方法的含义
            parent.Test3();
            /*
             Test1
virtual Test2
parent Test3
请按任意键继续. . .
}

另一个class文件 

 class Internal
    {
    }

关于new 与override区别,见https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/versioning-with-the-override-and-new-keywords

第二部分:关于抽象方法和虚方法

非常容易混淆,也是查看源代码过程中,常见的修饰

重点来说,如果类中从成员有虚方法,必须标记为抽象的类,且没有实现的方法提,类似接口

而虚方法则一定要有实现,

https://www.cnblogs.com/wang7/archive/2012/04/17/2453624.html 

结尾:工作项目中用到封装,比如以下代码,就用到接口interface ,抽象类,虚方法

  interface IInterOpEventHandler<TEvent> : ICZEventHandler<TEvent>
       where TEvent : CZInterOpEvent
    {
    }

    abstract class InterOpEventHandlerBase<TEvent> : IInterOpEventHandler<TEvent>
        where TEvent : CZInterOpEvent
    {
        /// <summary>
        /// 处理事件
        /// </summary>
        /// <param name="ev"></param>
        public virtual void Handle(TEvent ev)
        {
            if (ev == null) return;

            HandleLocally(ev);
        }

        /// <summary>
        /// 本地处理事件
        /// </summary>
        protected abstract void HandleLocally(TEvent ev);
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值