• C#中的继承 (继承、抽象类和抽象方法、接口)-转载


    原文连接:

    C#中的继承 (继承、抽象类和抽象方法、接口)

    最近在研究重构,所以对于类,接口这些研究的也比较多,然后看各种资料,只要我感觉到能学到东西,就记录下来,感觉是件有意义的事情。

    一、继承

    什么是继承:继承 是允许重用现有类去创建新类的过程。分类的原则 是一个类派生出来的子类 具有这个类的 所有非私有的属性。

    1、继承C#中的类:

    C# 不支持多重继承,C# 类始终继承自一个基类(如果未在声明中指定一个基类,则继承自 System.Object)。

    派生类继承基类的语法如下:

    using System;
    public class Person
    {
      //这是基类
    }
    public class Student:Person
    {
      //这是派生类
    }

    注:派生类继承基类时用 “:” 符号连接,派生类 继承基类的 所有非私有成员变量和方法。

    2、调用基类的构造函数:

    如果对类没有定义显式构造函数,则编译器将提供默认的构造函数,以初始化这些类的成员字段。但是,如果显式添加了构造函数,就可以有效控制整个构造过程。

    示例:

    using System;
    namespace Jicheng
    {
        //基类
        public class Person
        {
            public string  _name;
            public uint  _age;
            //基类的构造函数
            public Person(string name,uint age)
            {
                this._name = name;
                this._age = age;
                //打印输出
                Console.WriteLine(_name);
                Console.WriteLine(_age);
            }
        }
        //派生类
        public class Student:Person
        {
            private uint _id;
            //派生类构造函数并调用基类构造函数用“:base”
            public Student(string name,uint age uint id):base(name,age)
            {
                this._id = id;
                //打印输出
                Console.WriteLine(_id);
            }
        }
        public class Exercise
        {
            [STAThread]
            static void Main(string[] args)
            {
                //构造 Student
                Student objstudent=new Student(“XYZ”,45,001);
            }
        }
    }

    注:派生类通过使用:base()语法可以显式调用基类的构造函数。在必要的情况下,可以利用它来初始化字段。

    二、C#中的方法重写

    关键字:override

    override 关键字 用于修改方法,具有 override 关键字修饰符的方法 是对基类中同名方法的新实现,基类中的同名方法 必须声明为 virtual 或 abstract 类型。给基类中的方法 添加 virtual 关键字 表示可以在派生类中重写它的实现。

    1、默认的 C# 方法并非 virtual,因此不能重写。
    2、基类方法的可访问级别 并不因重写它的方法而改变,他们的访问修饰符相同。
    3、new、static 和 virtual 关键字不能与 override 访问修饰符一同使用

    关键字:virtual

    C# 中提供 virtual 关键字,用语将方法定义为支持多态,用于对一个类中可修改的方法的声明,这种方法称为 虚拟方法,字类可以使用 override 关键字自由实现它们各自版本的虚拟方法
    语法:

    [访问修饰符] virtual [返回值类型] 方法名称([参数列表])
    {
      //虚拟方法的实现
    }

    1、virtual 访问修饰符不能与 static 和 override 等访问修饰符一同使用
    2、调用虚拟方法,在运行时系统会自动检查,以确定 调用了哪一个实现方法。

    关键字:new

    new 访问修饰符 用于显式隐藏继承自基类的成员,如果派生类成员 与 基类成员名称相同,new 会将派生类成员识别为一个全新成员。
    1、在一个方法中同时使用 new 和 override 将会出错。
    2、new 访问修饰符的真正目的是为了 隐藏基类方法。
    3、如果将一个方法声明为 new,它实际上 并没有隐藏基类方法,并且编译器也产生了警告,这时应该删除 new。

    三、抽象类和抽象方法

    什么是抽象类:不能被实例化的类称为 抽象类,抽象类是 派生类的基类。
    关键字:abstract
    语法:

    abstract class 类名
    {
        …………
    }

    1、一个 抽象类 可以同时包含 抽象方法 和 非抽象方法。
    2、抽象方法只在派生类中真正实现,这表明抽象方法只存放函数原型,不涉及主体代码,
    3、派生自抽象类的类 需要实现其 基类的抽象方法,才能实例化对象。
    4、使用 override 关键字 可在派生类中实现抽象方法,经 override 声明重写的方法称为 重写基类方法,其签名必须与 override 方法的签名相同。

    示例:

    using System;
    namespace Example_5
    {
        //抽象类
        abstract class ABC
        {
             //抽象方法
             public abstract void Afunc();
        }
        //派生类
        class Derv:ABC
        {
            //实现抽象类中的抽象方法
            public override void Afunc()
            {
                Console.WriteLine(“实现抽象方法”);
            }
        }
        public class Test
        {
            static void Main(string[] args)
            {
                 Derv obj=new Derv();
                 obj.Afunc();
            }
        }
    }                

    5、基类 实现 抽象类,则 派生类 不需要重新实现该 抽象类。
    6、抽象类 并不仅仅只是一种实现技巧,它更代表一种抽象的概念,从而为所有的派生类确立一种约定。

    四、接口

    关键字:interface
    语法:

    修饰符 interface 接口名
    {
        //接口主体
    }

    1、一个接口 就相当于一个 抽象类,但是它不能包含任何实现方法。
    2、接口的每种方法都必须在派生类中实现。
    3、接口有时候可以看成是类的模具,它指明一个类该提供哪些内容。
    4、接口主体只限于方法、索引器、属性的声明。
    5、接口中不能包含字段、构造函数和常量等。
    6、接口成员是隐式公开的,如果对其显式指定访问级别,就会出现编译器错误。
    7、在接口中不能实现任何方法,属性或者索引器。
    8、在指定方法时,只需给出返回类型、名称和参数列表,然后以分号结束。
    9、实现接口的语法与实现继承一样,都用冒号“:”

    示例

    interface Icustomer
    {
    ………………
    }
    public class MyClass: Icustomer
    {
    ………………
    }

    10、接口中的方法不能重写,只能实现。
    11、
    编码标准:
    接口名称需始终冠以大写字母I

    五、多重接口实现

    C# 中多重接口的实现,弥补了 C# 只能单一继承,不能多重继承弱点。
    语法示例:

    public intetface IName
    {
        void Name();
    }
    public interface IAge
    {
        void Age();
    }
    public class Consoleshow: IAge, IName
    {
        public void Name()
        {
            //具体实现
        }
        public void Age()
        {
            //具体实现
        }
    }

    六、显式接口实现

    如果两个接口中有完全相同的签名,那么可以用 “接口名.方法名” 的方法 显式的来实现接口。
    示例:

    public interface Iname
    {
        void Test();
    }
    public interface Iage
    {
        void Test();
    }
    public Test: Iname, Iage
    {
        void Iname Test()
        {
            // Iname借口的实现
        }
        void Iage Test()
        {
            // Iage借口的实现
        }
    }

    七、接口继承

    通过合并其他接口,也可以新建接口。用于合并接口的语法 与 继承的语法 非常相似,只是前者 可以将多个接口 合并成一个。

    一个类 要实现 一个接口,必须为 基接口 和 派生借口 的所有成员编写代码。

    原文连接:https://www.cnblogs.com/LavenderDaisy/p/4035130.html

    C#中的继承 (继承、抽象类和抽象方法、接口)

    底部

  • 相关阅读:
    Traefik-v2.x快速入门
    jenkins pipeline持续集成
    phpstorm 2017激活码(方法)
    PHP保留两位小数的几种方法
    php 数组排序 按照某字段
    sql大全
    解决jpgraph在php7.0版本下时,无法显示例子图表的问题
    Linux 定时任务crontab使用
    VIM命令操作
    wampserver变橙色,apache 服务无法启动!问题解决小记(安装失败亦可参考)
  • 原文地址:https://www.cnblogs.com/HarryVan/p/15260142.html
Copyright © 2020-2023  润新知