C#关键字--修饰符

  1. 访问修饰符:public、protected、private、internal
    用于指定声明的成员或类型的可访问性。
    public:不受限
    protected:仅限于包含类或包含类派生的子类
    internal:当前程序集
    protected internal:internal 或 protected ,两者求并集
    private:当前包含类型


  2. abstract
    指示被修改内容的实现已丢失或不完整。
    可用于修饰类、方法、属性、索引和事件。

    • 抽象类
      抽象类不能实例化
      包含0个或1个以上抽象方法和访问器(属性) ,抽象类中不一定有抽象方法或抽象访问权(属性)
      不能用sealed修饰,sealed和abstract具有相反的含义。sealed类不能被继承,abstract类要求被继承
    • 抽象方法和抽象属性
      指示方法或属性不包含实现
      抽象方法是隐式的虚方法
      只有抽象类中才有抽象方法声明
      通过override在派生类中重写替代抽象方法或属性
      抽象类必须为所有实现的接口提供实现,可将接口映射到抽象方法上,例如:
       
      interface I
      {
      void M();
      }
      abstract class C : I
      {
      public abstract void M();
      }
  3. sealed
    断子绝孙符
    修饰类时,类不可以被继承
    修饰方法/属性时,子类不能替代此方法或属性


  4. virtual
    用于修改方法、属性、索引器或事件声明,并使它们可以在派生类中被重写
    虚成员的实现可由派生类中的替代成员更改
    虚方法就是有默认实现的抽象方法
    在修饰方法时override和new的区别:
    override只能重写virtual、abstract、override修饰的方法
    new是隐藏,可通过类型转换调用到基类的方法。
    override是重写,无论是派生类还是基类都会找到派生类方法。
    new可以隐藏基类中的普通方法,也可以隐藏基类中的虚方法。
    new可以修改方法可访问性,而override不可以。

public class A
    {
        public void method1()
        {
            Console.WriteLine("this is A method1");
        }
        public virtual void method2()
        {
            Console.WriteLine("this is A method2");
        }

        public void method3()
        {
            Console.WriteLine("this is A method3");
        }

        public virtual void method4()
        {
            Console.WriteLine("this is A method4");
        }
    }

    public class B : A
    {
        public void method1()
        {
            Console.WriteLine("this is B method1");
        }
        public override void method2()
        {
            Console.WriteLine("this is B method2");
        }
        public new void method3()
        {
            Console.WriteLine("this is B method3");
        }

        //private virtual 错误
        //private virtual void method4()
        //{
        //  Console.WriteLine("this is A method4");
        //}

        //private override 错误
        //private override void method4()
        //{
        //  Console.WriteLine("this is A method4");
        //}

        //private new 正确
        private new void method4()
        {
            Console.WriteLine("this is A method4");
        }
    }

        public static void main()
        {
            A a1 = new A();
            A a2 = new B();
            B a3 = new B();

            Console.WriteLine("A A*******************");
            a1.method1();
            a1.method2();
            a1.method3();
            Console.WriteLine("A B*******************");
            a2.method1();
            a2.method2();
            a2.method3();
            Console.WriteLine("B B*******************");
            a3.method1();
            a3.method2();
            a3.method3();
            Console.WriteLine("(A) A B*******************");
            ((A)a2).method1();
            ((A)a2).method2();
            ((A)a2).method3();
            Console.WriteLine("(A) B B*******************");
            ((A)a3).method1();
            ((A)a3).method2();
            ((A)a3).method3();
        }

输出结果:
这里写图片描述

A A*******************
this is A method1
this is A method2
this is A method3
A B*******************
this is A method1
this is B method2
this is A method3
B B*******************
this is B method1
this is B method2
this is B method3
(A) A B*******************
this is A method1
this is B method2
this is A method3
(A) B B*******************
this is A method1
this is B method2
this is A method3



abstract、virtual、override、new

abstract和virtual都是用于修饰基类方法
virtual有默认实现,abstract无实现
abstract方法一定是在抽象类中出现,virtual不一定
override用于重写abstract、virtual和override修饰的方法
new用于隐藏基类中的普通方法或override修饰的方法
new可修改方法的可访问性,override不可以
new隐藏的方法可通过对象类型转换进行调用,override对象类型转换后调用的还是派生类的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值