随笔 - 13  文章 - 0  评论 - 4  阅读 - 3762

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   叶落偏多雨  阅读(100)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示