C#基础学习之继承

  继承是在类之间建立一种相交的关系,使得新定义的派生类的实例可以继承已有的基类的特征并且还可以添加新的功能。以前对继承的理解仅仅限于定义,下面是我查了些资料、写了点代码的总结。

1.C#继承的特点

(1) 派生类是对基类的扩展,派生类可以添加新的成员,但不能移除已经继承的成员的定义。

(2)继承是可以传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中声明的成员。

(3)构造函数和析构函数不能被继承,除此之外其他成员能被继承。基类中成员的访问方式只能决定派生类能否访问它们。

(4)派生类如果定义了与继承而来的成员同名的新成员,那么就可以覆盖已继承的成员,但这兵不是删除了这些成员,只是不能再访问这些成员。

(5)类可以定义虚方法、虚属性及虚索引指示器,它的派生类能够重载这些成员,从而使类可以展示出多态性。

(6)派生类只能从一个类中继承,可以通过接口来实现多重继承。

2.一个简单的基础实现

//从运行结果可以看到很重要的一点,继承时先执行父类构造函数,
    //接着再执行子类构造函数,最后再执行方法
    class Program
    {
        static void Main(string[] args)
        {
            Man man = new Man();
            man.Eat();
            //在派生类中访问基类中的成员一般有2种方式,一是调用base.<成员> 调用基类的方法,二是显示类型转换为父类
            ((People)man).Eat();
        }
    }
    public class People
    {
        public People()
        {
            Console.WriteLine("父类的构造函数");
        }
        public void Eat()
        {
            Console.WriteLine("父类吃饭");
        }
    }
    class Man:People
    {
        public Man()
        {
            Console.WriteLine("子类构造函数");
        }
        public void WhoEat()
        {
            base.Eat();
        }
    }

3.隐藏基类成员

//当派生类需要覆盖基类的方法时,C#使用new修饰符来实现隐藏基类成员
    class Program
    {
        static void Main(string[] args)
        {
            Man man = new Man();
            man.Eat();
        }
    }
    public class People
    {
        public People()
        {
            Console.WriteLine("父类的构造函数");
        }
        public void Eat()
        {
            Console.WriteLine("我是父类");
        }
    }
    class Man:People
    {
        public Man()
        {
            Console.WriteLine("子类构造函数");
        }
        public new void Eat()
        {
            Console.WriteLine("我是子类");
        }
    }

4.抽象类、密封类、抽象方法和虚方法

  首先还有一种类需要注意,那就是密封类。如果我们对类不作任何约束,也就是说所有类都可以被继承,这种继承的滥用会导致类的层次结构十分庞大,类与类之间的关系会变得很乱导致无法理解。因此C#提供了密封类,我们只需在父类前加上sealed修饰符,那这个类将不能被继承了。密封方法也是在方法前加上sealed修饰符。

  抽象类和密封类刚好相反,它是为继承而生的。抽象类不能实例化,抽象方法没有具体执行代码,必须在非抽象的派生类中重写。也就是基类并不实现任何执行代码,只是进行定义。这一点和接口有相同的地方。

 class Program
    {
        static void Main(string[] args)
        {
            Man man = new Man();
            man.Eat();
            man.Say();
        }
    }
    public abstract class People
    {
        //注意:如果类中有抽象方法,则类必须声明为抽象类。
        public People()
        {
            Console.WriteLine("父类的构造函数");
        }
        public abstract void Eat();
        //有时候不想把类声明为抽象类,但又想实现方法在基类里不具体实现,
        //而是想实现方法由派生类重写。遇到这种情况时可使用virtual关键字将方法声明为虚方法
        public virtual void Say()
        {
            //注意虚方法必须声明方法主体,抽象方法则不需要
            Console.WriteLine("我是父类的虚方法");
        }
    }
    class Man:People
    {
        public Man()
        {
            Console.WriteLine("子类构造函数");
        }
        public override void Eat()
        {
            Console.WriteLine("我是子类");
        }
        public override void Say()
        {
            Console.WriteLine("我是子类的Say方法");
        }
    }

5.有参数的构造函数 

    class Program
    {
        static void Main(string[] args)
        {
            Man man = new Man("构造函数");
            //结果仍然是先输出父类构造函数,然后再输出子类构造函数
        }
    }
    public  class People
    {
        public  People(string s)
        {
            Console.WriteLine("父类"+s);
        }
    }
    class Man:People
    {
        //在继承时,如果基类构造函数是有参数的,子类构造函数也必须有一个有参数的构造函数,否则会报错
        public Man(string s):base(s)
        {
            Console.WriteLine("子类构造函数");
        }
    }
时间: 2024-10-06 00:39:28

C#基础学习之继承的相关文章

java基础学习笔记-继承

继承是复用程序代码的有力手段,当多个类(Sub1,Sub2,...Sub100)之间存在相同的属性和方法时,可从这些类中抽象出父类Base.在父类Base中定义这些相同的属性和方法,所有的Sub类无须重新定义这些属性和方法,而只需要通过extends语句来声明继承Base类: public class Sub extends Base {...} Sub 类就会自动拥有在Base类中定义的属性和方法. 6.1 继承的基本语法 在JAVA语言中,用extends 关键字来表示一个类继承了另一个类,

Java基础学习-extends继承(成员变量,局部变量,成员方法)

package extend; /*面向对象-继承: * 多个类的共同成员变量和成员方法.抽取到另一个类中(父类),我们多个类就可以访问到父类的成员了 * */ class Game{ String name; double vesion;//版本号 String agent;//代理商 public void start() { System.out.println("游戏启动"); } public void stop() { System.out.println("游戏

C++基础学习教程(七)----类编写及类的两个特性解析---&gt;多态&amp;继承

类引入 到目前为止我们所写的自定义类型都是关键字struct,从现在起我们将采用class方式定义类,这种方式对于学习过其他高级语言包括脚本(Such as Python)的人来说再熟悉不过了. 但是在写之前我们还是需要比较一下用struct和class之间有什么区别. 首先对于struct,在C兼容性方面很重要,尽管C++是有别于C的另一门语言,但许多程序还是必须与C交互,C++有两个重要功能,可以方便的与C交互.其中之一的就是POD,即是Plain Old Data(简单旧式数据)的缩写.

Java基础学习191221(可变参数,数组,Array类,稀疏数组,继承重写多态,抽象类,接口)

Java基础学习 可变参数 在方法声明中,在指定参数类型后加一个省略号(...). 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数.任何普通参数都必须在它之前声明. public class printMax { public static void main(String[] args) { printMax(1,5,8,78,415,15); } public static void printMax( double... numbers){ if (numbers.length

蓝鸥零基础学习HTML5—html+css基础

蓝鸥零基础学习HTML5-html+css基础 一.课程目标 1.了解前端开发职位:2.掌握常用标签以及语义及用法:3.掌握常用css的特性,掌握基础布局技巧:4.掌握整站规划概念. 二.适用人群 零基础积极学习html5者 三.课程简介 本课程主要讲解了 html+css的基础知识,包括html模板.标签.css基础样式.布局.表格表单.整站等等,是进行前端开发的基础.Html+css是前端开发的基础,大部分前端开发工程都需要从html+css布局开始,html+css的基础非常重要,是前端开

Objc基础学习记录5

NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendingFormat:可以添加多个类型的字符串. int,chat float,double等 3.stringWithString 创建字符串, 4.rangeOfString 返回str1在另一个字符串中的位置. 5.NSMakeRange(0,3) 字符串0位到3位. 6.deleteCharac

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

Yaf零基础学习总结3-Hello Yaf

Yaf零基础学习总结3-Hello Yaf 上一次我们已经学习了如何安装yaf了,准备工作做好了之后我们来开始实际的编码了,码农都知道一个经典的语句就是“Hello World”了,今天我们开始入手Yaf,目标只要能得到“Hello Yaf”就可以了,不多说,下面开始了.(注:需要读者有一定的MVC知识基础,最好用过一些其他简单的框架) 1.组织目录结构 对于使用过框架的来说这点很好理解,对于没使用过框架的来说建议先别在这死磕,先记着吧,简单点就是对于我们的文件结构做一些规定,让自己和别人都能看

c++ 基础学习: 左值 概念cocos2d-x3.0的实际应用

左值:概念baidu 1.2.6.2 与Cocos2d-x内存管理的结合 在2.x的使用场景中,CCArray和CCDictionary通常被分配在堆上,我们不得不需要考虑在适当的地方释放其内存.新的容器类不再继承自Ref(2.x中的CCObject),新的容器类通常应该被分配在栈上来使用,这简化了内存管理,我们应该将精力放在容器元素而不是容器本身的内存管理上. Vector中的T和Map<K,V>中的V必须是Ref类型,因为它们需要结合Cocos2d-x的内存管理方式一起工作.这简化了容器中