c#-03关于类和继承的基本知识

一、类继承

  • 通过类继承可以定义一个新类,新类纳入一个已经声明的类进行扩展
  • 已经存在的类叫做基类,而通过继承出的类叫做派生类,派生类的组成为:
    • 本身声明中的成员
    • 基类的成员
  • 派生类无法删除基类成员,但可以屏蔽,可以扩展自身方法和变量
  • 格式: class OtherClass :SomeClass
    • OtherClass 是派生类,而SomeClass 是基类
  • 代码示例:
    using System;
    
    namespace Derived_Class
    {
        class SomeClass
        {
            public int x = 10;
            public string y = "This is father";
            public void Display()
            {
                Console.WriteLine($"{y} and x : {x} ");
            }
        }
        class OtherClass : SomeClass
        {
            private string s = "This is son";
            public void Displays()
            {
                Console.WriteLine($"{s} and x : {x}");
                
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                SomeClass ax=new SomeClass();   //基类
                OtherClass bx=new OtherClass(); //派生类
                ax.Display();
                bx.Displays();
            }
        }
    }
    

二、屏蔽基类成员

  • 虽然派生类无法删除基类成员,但是可以屏蔽基类成员,使用new以及相同名称可以屏蔽基类成员,这是继承的基本功能之一,例如我们使用一个方法,但是这个方法适用于基类而非派生类,那么就需要来屏蔽基类成员
  • 格式:使用关键词 new 来使基类 变量/方法 被屏蔽
    Class OtherClass
    {
        new private int x=11;
        ···
    }
    
  • 代码示例
        using System;
        namespace Derived_Class
        {
            class SomeClass
            {
                public int x = 10;
                public string y = "This is father";
                public void Display()
                {
                    Console.WriteLine($"{y} and x : {x} ");
                }
            }
            class PrimClass : SomeClass
            {
                new private string y = "This is other son"; //基类屏蔽
                new private int  x = 29; //基类屏蔽
                private int z = 30;
                new public void Display()
                {
                    Console.WriteLine($"{y} and x : {x} ");
                }
            }
            class Program
            {
                static void Main(string[] args)
                {
                    SomeClass ax=new SomeClass();   //基类
                    PrimClass cx = new PrimClass(); //派生类,屏蔽了基类方法和变量
                    ax.Display();
                    cx.Display();
                }
            }
        }
    

基类访问

  • 如果派生类必须访问被隐藏的基类成员,那么可以使用基类访问,由关键词 base 后面加一个 “ . ” 来实现
  • 代码示例:
    class PrimClass : SomeClass
    {
        new private string y = "This is other son"; //基类屏蔽
        new private int  x = 29; //基类屏蔽
        private int z = 30;
        new public void Display()
        {
            Console.WriteLine($"{y} and x : {x} ");
            Console.WriteLine($"base.y {base.y} and base.x: {base.x} "); //基类访问
        }
    }
    

基类引用

  • 若要使用派生类的基类部分,这时候就要用到基类的引用
  • 格式:
      OtherClass md= new OtherClass();
      BaseClass mc = (BaseClass)  md;
    
  • 上述 mc 就可以访问 md 的基类部分
    • 除此之外 mcmd 访问的位置是一样的,如果对 mc 进行修改,那么 md 的基类部分也会进行修改
    • mc 是无法看到 md 的派生类部分的

虚方法和覆写方法

  • 在上一节我们看到,当使用基类引用访问派生类对象时,得到的是基类的成员。虚方法可以使基类的引用访问“升至”派生类内
  • 可以使用基类引用调用派生类的方法,只需满足下面的条件。
    • 派生类的方法和基类的方法有相同的签名和返回类型。
    • 基类的方法使用virtual标注。
    • 派生类的方法使用override标注。
  • 下面的代码展示了基类方法和派生类方法的virtual及oeride修饰符。
    using System;
    
    namespace UsingOverrideVirtual
    {
        class MyBaseClass
        {
            private int val = 5;
            virtual public int MyProperty
            {
                get { return val;  }
            }
        }
    
        class MySecondClass : MyBaseClass
        {
            private int val = 10;
            public override int MyProperty
            {
                get { return val; }
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                MySecondClass mc = new MySecondClass();
                MyBaseClass md = (MyBaseClass)mc;
                Console.WriteLine($" {mc.MyProperty} ");
                Console.WriteLine($" {md.MyProperty} ");
            }
        }
    }
    
posted on 2022-09-25 15:49  叶落偏多雨  阅读(134)  评论(0)    收藏  举报