继承是C#的三大特性之一,它实现了多态性和代码复用

  我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父类。

  Student、Teacher、Driver    子类 派生类
  Person                  父类 基类

1.  子类继承了父类,那么子类从父类那里继承过来了什么?
  首先,子类继承了父类的属性和方法,但是子类并没有继承父类的私有字段。

  子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员。

2.  问题:子类有没有继承父类的构造函数?

  答:子类并没有继承父类的构造函数,但是。子类会默认的调用父类无参数的构造函数,创建父类对象,让子类可以使用父类中的成员。所以,如果在父类中重新写了一个有参数的构造函数之后,那个无参数的就被干掉了,子类就调用不到了,所以子类会报错。

  解决办法:
  1)、在父类中重新写一个无参数的构造函数。
  2)、在子类中显示的调用父类的构造函数,使用关键字:base()

3.  在创建子类对象的时候,为什么会先在子类对象的内部创建一个父类对象出来?

  由于继承的原因,子类能够使用父类的属性和方法,如果没有创建父类的对象的话,就不能够使用父类的属性和方法了。

4. 继承的特性

  1、继承的单根性:一个子类只能有一个父类,不允许多重继承。
  2、继承的传递性: 祖宗的东西迟早都是我的,子类的派生类也可以调用子类的父类的方法。

    A 继承 B,C是A的派生类,那么C也可以调用B的属性和方法。

5. object类是所有类的基类

6. new关键字的作用

   1)、创建对象      Class1 c = new Class1();
     2)、隐藏从父类那里继承过来的同名成员。
      隐藏的后果就是子类调用不到父类的成员。
      子类与父类 尽量不要出现同名的成员,如果有请使用new来隐藏

    public class Animal
{
public virtual void Eat() { Console.WriteLine("Animal eat"); }
}
public class Cat: Animal
{
public new void Eat() { Console.WriteLine("Cat eat"); }
public void Eating() { Console.WriteLine("Cat eating"); }
} class Program
{
static void Main(string[] args)
{
Animal a = new Animal();
a.Eat(); Animal ac = new Cat();
ac.Eat(); //输出:Animal eat 并非Cat eat
//ac 这个对象无法调用 Cat类的eating方法 Cat c = new Cat();
c.Eat();
}
}

输出结果:

  Animal eat

  Animal eat

  Cat eat

第2句为什么会是 Animal eat 而非Cat eat呢?

   因为,使用new关键字后,使得Cat中的Eat()方法和Animal中的Eat()方法成为毫不相关的两个方法,只是它们的名字碰巧相同而已。

   此时,对于ac这个对象而言,Cat中的Eat()方法就如同Eating()方法了,它们都是Cat类独有的方法,ac无法调用到它们。

  假如我们只使用了new关键字,如果Cat类没用从Animal类继承Eat()方法,编译器会输出警告!

    在程序中,Animal类型的对象ac指向了Cat类型的对象所占据的内存时,Cat中的Eat()方法和Animal中的Eat()方法毫无关系,所以Cat中的Eat()方法就是Cat类中独有的方法了。这样ac无法调用Cat中的Eat方法,于是就会去调用Animal中的Eat方法。

 

7. 里氏转换原则  

  1)、子类可以赋值给父类

   2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象。

            Hero[] heros = new Hero[];
Random ran = new Random();
// 里氏转换的第一条规则: 子类可以赋值给父类
for (int i = ; i < heros.Length; i++)
{
int random = ran.Next(,);
switch (random)
{
case :
heros[i] = new ZhuGeLiang();
break;
case :
heros[i] = new SunShangXiang();
break;
case :
heros[i] = new SiMaYi();
break;
case :
heros[i] = new CaiWenJi();
break;
case :
heros[i] = new Hero();
break;
}
} //里氏转换的第2条规则:如果父类中装的是子类的对象,那么就可以将这个父类强转为子类的对象。
for (int i = ; i < heros.Length; i++)
{
//heros[i].LaunchSkill();
if (heros[i] is ZhuGeLiang)
{
((ZhuGeLiang)heros[i]).WatchStar();
}
else if (heros[i] is SunShangXiang)
{
((SunShangXiang)heros[i]).GetMarried();
}
else if (heros[i] is SiMaYi)
{
((SiMaYi)heros[i]).GostSkill();
}
else if (heros[i] is CaiWenJi)
{
((CaiWenJi)heros[i]).SorrowSong();
}
else
{
heros[i].LaunchSkill();
} } Console.ReadKey();
} class Hero
{
public void LaunchSkill()
{
Console.WriteLine("我是白板,没有技能。");
}
} class ZhuGeLiang : Hero
{
public void WatchStar()
{
Console.WriteLine("知天易逆天难。");
}
} class SunShangXiang : Hero
{
public void GetMarried()
{
Console.WriteLine("他好,我也好。");
}
} class SiMaYi : Hero
{
public void GostSkill()
{
Console.WriteLine("吾乃天命之子。");
}
} class CaiWenJi : Hero
{
public void SorrowSong()
{
Console.WriteLine("悲歌可当泣,远望可当归。");
}
}

C#基础知识——类的继承的更多相关文章

  1. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  2. 《Java基础知识》Java继承的概念和实现

    继承时类和类之间的关系,是一个很简单很直观的概念,与显示生活中的继承(例如儿子继承了父亲财产)类似. 继承可以理解为一个类从另一个类中获取方法和属性的过程.如果类B继承于类A,那么类B就拥有类A的属性 ...

  3. 【代码笔记】Java基础:类的继承(构造器)

    在Java中,创建对象的格式为: 类名 对象名 = new 类名(): 如: 1 JFrame jf = new JFrame(); 一个对象被创建出来时,经常要先做一些事这个对象才能正常使用,也可以 ...

  4. javascript基础知识-类和模块

    在JavaScript中可以定义对象的类,让每个对象都共享这些属性. 在JavaScript中,类的实现是基于其原型继承机制的.如果两个实例都从同一个原型对象上继承了属性,我们就说它们是同一个类的实例 ...

  5. Java基础 -- 复用类(组合和继承)

    复用类有两种实现方式. 在新的类中产生现有类的对象,由于新的类是由现有类的对象所组成,所以这种方法称之为组合. 采用继承实现. 一  组合语法 下面创建两个类WaterSource和Sprinkler ...

  6. es6基础:类、继承、重写

    es6真正的引入的面相对象的类,以前我们总是通过其他手段来模拟类这种形式,现在终于有了,我有点开心,又有点难过,因为在我看来,js并不是所谓的面相对象的语言,反而更偏向函数式,原型继承是他真正的面目. ...

  7. java基础知识—类的方法

    1.定义类方法的语法: 访问修饰符 返回值类型 方法名(){ 方法体: } 2.方法名的规范: 1.必须以字母下划线·“—”或“$”开头 2.可以有数字,但不能以数字开头. 3.如果方法名是以多个单词 ...

  8. java基础知识—类和对象

    1.对象的特征---类的属性 每个对象的每个属性都有特定的值 对象的操作---类的方法 2.封装 对象同时具有属性和方法两项属性. 对象的属性和方法同时被封装在一起,共同体现事物的特性,二者相辅相成, ...

  9. java基础/一个类A继承了类B,那么A就叫做B的派生类或子类,B就叫基类或超类。

    类重复,pulic class demo1 和class demo1 重复 无主类, 在cmd中输入命令: SET CLASSPATH=. (等号后为英文点符号),即可设置解释的路径为当前路径. 再次 ...

随机推荐

  1. Windows 7的 磁盘管理中,某个磁盘或分区,突然变成只读。

    1.今天突然发现E盘无法创建文件夹.文件,也不可以改,感觉像是变成只读 . 2.我的电脑 -> 计算机管理 -> 存储 -> 磁盘管理,发现E盘下面标记着只读两个字. 3.由于我的E ...

  2. SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比

    原文:SQL点滴10-使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比 今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊.看了一位博主的文章 ...

  3. [翻译]初识SQL Server 2005 Reporting Services Part 3

    原文:[翻译]初识SQL Server 2005 Reporting Services Part 3 这是关于SSRS文章中四部分的第三部分.Part 1提供了一个创建基本报表的递阶教程.Part 2 ...

  4. 读书笔记—CLR via C#委托和attribute

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  5. SQLSever: 如何在select中的每一行产生不同的随机数?

    原文:SQLSever: 如何在select中的每一行产生不同的随机数? select 的随机函数有点假, 也许是因为它是基于时间来的吧, 同一select中由于时间无法错开导致产生的随机数都是一样的 ...

  6. 【AngularJS】 2.0 版本发布

    [AngularJS] 2.0 版本发布 w5cValidator[AngularJS] 2.0 版本发布   w5cValidator 插件基于angular原有的表单验证,在原有的基础上扩展了一些 ...

  7. asp.net MVC2.0学习笔记

    asp.net;与mvc都是不可替代的:只是多一种选择:(解决了许多asp.net的许多缺点) model:充血模型.领域模型:很大程度的封装: 控制器:处理用户的交互,处理业务逻辑的调用,指定具体的 ...

  8. MVC Sesion丢失问题

    花了两个小时的时间处理一个Session 取值问题 使用MVC LoadCheckController(登录校验)登录成功后创建一个Session,Session中封装了用户的相关信息如权限基本信息, ...

  9. CEGUI添加自定义控件

    用CEGUI做界面将近3个月了,比较忙,而且自己懒了许多,没能像以前那样抽出大量时间研究CEGUI,查阅更多的资料书籍,只是在工作间隙,将官网上的一些资料和同事推荐的<CEGUI深入解析> ...

  10. HTML页面规范分解

    百度,淘宝,腾讯三大巨头HTML页面规范分解   [兼容html5方案] 百度贴吧,百度图片的实现 <!--[if lt IE 9]> <script> (function() ...