首页 > 编程语言 >c#-03关于类和继承的基本知识

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

时间:2022-09-25 15:55:15浏览次数:68  
标签:基类 03 c# SomeClass 基本知识 int 派生类 new public

一、类继承

  • 通过类继承可以定义一个新类,新类纳入一个已经声明的类进行扩展
  • 已经存在的类叫做基类,而通过继承出的类叫做派生类,派生类的组成为:
    • 本身声明中的成员
    • 基类的成员
  • 派生类无法删除基类成员,但可以屏蔽,可以扩展自身方法和变量
  • 格式: 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} ");
            }
        }
    }
    

标签:基类,03,c#,SomeClass,基本知识,int,派生类,new,public
From: https://www.cnblogs.com/bzxf/p/16728010.html

相关文章

  • 使用pychrm编写第一个Flask Web程序
    使用pychrm编写第一个FlaskWeb程序fromflaskimportFlaskapp=Flask(__name__)#实例化类[email protected]('/')#装饰器操作,实现URL地址defhello():......
  • 对比python学julia(第四章:人工智能)--(第一节)OpenCV编程初步(1)
    1.1.   OpenCV简介OpenCV的全称是OpenSourceComputerVisionLibrary(开源计算机视觉库),它是一个功能强大的跨平台开源计算机视觉库,可应用于人机互动、物体......
  • 20220925 - CSP-S 模拟赛 #2
    20220925-CSP-S模拟赛#2时间记录\(8:00-8:20\)浏览题面\(8:20-8:45\)T1想到了分块计算,但是在手推样例的过程中,发现样例的数据并不能真正构成一局“扫雷”......
  • P7368 [USACO05NOV]Asteroids G
    题面贝茜想在\(N\timesN\)的网格中驾驶她的宇宙飞船。网格中有\(K\)个小行星。要使驾驶过程愉快,就必须把这些小行星全部消除。贝茜有一个武器,可以以一个单位代价消......
  • Scanner进阶用法
    Scanner进阶用法判断是否为整数,浮点数packagecharpter2;​importjava.util.Scanner;​publicclassScanner3{  publicstaticvoidmain(String[]args){  ......
  • ArcGIS 修改属性字段类型 字符串转数字
    https://www.docin.com/p-58631989.htmlhttps://support.esri.com/zh-cn/technical-article/000002287......
  • 装饰模式 Decorator
    “单一职责”模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。典型模式......
  • 创新案例|市值$400亿的设计平台Canva的增长策略
    澳大利亚在线平面设计工具「Canva」目前估值已达400亿美元,成为全球最有价值初创公司之一。是什么让Canva实现如此高速的增长?本文将通过研究Canva的产品体验创新、付费......
  • C语言max宏的进化
    C语言max宏的进化lv1:shit#defineMAX(a,b)a>b?a:b问题所在不必多言lv2:角度:参数也可为expr解:#defineMAX(a,b)(a)>(b)?(a):(b)bug示例:#i......
  • csapp cache lab partB,30行不到全case通用解法
    #defineROUND_UP(x,align)(((int)(x)+(align-1))&~(align-1))#defineMIN(a,b)(((a)<(b))?(a):(b))#defineBLOCK_SZ8voidtranspose_submit(int......