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

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("子类构造函数");
}
}

C#基础之继承的更多相关文章

  1. 二十二. Python基础(22)--继承

    二十二. Python基础(22)--继承 ● 知识框架   ● 继承关系中self的指向 当一个对象调用一个方法时,这个方法的self形参会指向这个对象 class A:     def get(s ...

  2. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...

  3. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  4. 三、Java基础---------关于继承、构造函数、静态代码块执行顺序示例讲解

    在上节博客中曾提到过类的继承,这篇文章主要是介绍类的继承.构造函数以及静态代码块的执行顺序. 首先接着分析在黑马基础测试中的一个关于继承的题目,题目描述如下: 声明类Person,包含2个成员变量:n ...

  5. JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)

    实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...

  6. 【Java基础】继承的一些总结

    什么是继承 把一些类的具有共性的东西剥离出来形成一个新的类,然后各个其他类保留自己独有的特性,并用关键字extends继承这个剥离出来的新的类,可以最终达到各类原始相同效果,但是在每个类中,单用一个“ ...

  7. Java基础08 继承

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 继承(inheritance)是面向对象的重要概念.继承是除组合(composit ...

  8. C++基础——类继承中方法重载

    一.前言 在上一篇C++基础博文中讨论了C++最基本的代码重用特性——类继承,派生类可以在继承基类元素的同时,添加新的成员和方法.但是没有考虑一种情况:派生类继承下来的方法的实现细节并不一定适合派生类 ...

  9. Python基础之继承与派生

    一.什么是继承: 继承是一种创建新的类的方式,新建的类可以继承一个或过个父类,原始类成为基类或超类,新建的类则称为派生类 或子类. 其中,继承又分为:单继承和多继承. class parent_cla ...

  10. Python设计模式 - 基础 - 封装 & 继承 & 多态

    面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...

随机推荐

  1. linux性能系列--网络

    一.为啥网络监控不好做?   回答:网络是所有子系统中最难监控的了.首先是由于网络是抽象的,更重要的是许多影响网络的因素并不在我们的控制范围之内.这些因素包括,延迟.冲突.阻塞等 等.由于网络监控中, ...

  2. 用valgrind检测php扩展内存泄露

    原文:https://bugs.php.net/bugs-getting-valgrind-log.php 前提 1,编译php的时候,必须要带上--enable-debug选项. 2,禁用php的内 ...

  3. Discuz3.3注册程序修改添加记录推荐人账号

    Discuz3.3注册入口地址为:member.php?mod=register 一.member.php: 打开之后,代码非常简单. 其中有一句: $mod = !in_array($discuz- ...

  4. 页面请求速度慢,TTFB时间长的问题分析

    线上环境发现用户请求某个页面时,出现请求速度慢页面卡顿白屏的现象,通过chrome开发工具调试查看Timing,花费在waiting(TTFB)上的时间过长,几秒十几秒不等 TTFB全称Time To ...

  5. 【[NOI2009]管道取珠】

    --\(shallwe\):这道题是\(noipDay2T2\)难度 好一个\(Day2T2\)难度啊,我觉得我可以退役了 平方和好像没有什么办法可以快速统计,于是考虑转化一下 我们可以将题意转化成这 ...

  6. Web项目打成war包部署到tomcat时报MySQL Access denied for user 'root'@'localhost' (using password: YES)错误解决方案

    Web项目使用使用root账号root密码进行部署,通过Eclipse加载到Tomcat服务器可以发布成功,打成war包放到tomcat的webapps目录无法发布成功,报错: jdbc.proper ...

  7. 一步步入门编写PHP扩展

    1.写在最前 随着互联网飞速发展,lamp架构的流行,php支持的扩展也越来越多,这样直接促进了php的发展. 但是php也有脚本语言不可避免的问题,性能比例如C等编译型语言相差甚多,所以在考虑性能问 ...

  8. [Python 网络编程] TCP编程/群聊服务端 (二)

    群聊服务端 需求分析: 1. 群聊服务端需支持启动和停止(清理资源); 2. 可以接收客户端的连接; 接收客户端发来的数据 3. 可以将每条信息分发到所有客户端 1) 先搭架子: #TCP Serve ...

  9. PAT——1032. 挖掘机技术哪家强

    为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行,每行给出一位 ...

  10. [SCOI2005]互不侵犯(状压DP)

    嗝~算是状压DP的经典题了~ #\(\mathcal{\color{red}{Description}}\) 在\(N×N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻 ...