继承

object是引用类型

public:最高权限,公开的
Protected:外部不可以访问
Internal:类的默认访问是什么作用域
Private:类成员默认
 

基类实例:可以通过base调用父类的指定方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace m1w3d4_inherit
{
#region 继承
//
class Person
{
protected String name;
protected string sex;
protected int age;
protected String hobby;
public Person(string name, string sex, int age, string hobby)
{
this.name = name;
this.sex = sex;
this.age = age;
this.hobby = hobby;
}
public Person()//没有无参构造,派生类会报错,派生类是根据基函数的默认构造构造的,如果已有base指定的构造函数,可以删除但不建议
{
}
public void SayHello()
{
Console.WriteLine("你好,我是{0},{1},我今年{2}岁了,爱好是{3}", name, sex, age, hobby);
}
}
class Teacher : Person //之类:父类 只能直接继承一个父类
{
public Teacher(string name, string sex, int age, string hobby) : base(name, sex, age, hobby)
{
Console.WriteLine("我是Person的基类");
}
public void Teach()
{
Console.WriteLine("我在教书");
}
}
//如果我们定义了若干类,这些类都有一些共有的属性和方法
//我们可以把这些共有部分抽象建立一个新的类,作为基类
//已解决我们代码重复的问题,以便于管理
//如果继承关系建立,子类的构造函数将会默认指向父类的无参构造
//我们可以通过this调用自身的另一个构造函数
//我们可以通过base调用父级的构造函数
//继承:子类继承的是父类所有成员
//但是你只能访问父类成员作用域允许的成员,除了private
//如果你的成员需要外部访问,只能是public
//如果你在子类里写一个和父类的同名同参数列表的方法,你可以使用new
//当你new
//记者(reporter):我是一个男性狗仔 我今年34了 。爱好是偷拍。
//有两个方法 偷拍 和 自我介绍
//
//司机(driver):我叫张三 男 我43岁了 ,爱好打蓝球。
//有两个方法 打蓝球 和 自我介绍
//
//程序员(programmer):我叫李四 我23 ,喜欢看电影。
//有两个方法 看电影 和 自我介绍
//
//抽象出上面三个类的基类,并在其构造函数中打印我是基类
class Reporter : Person
{
string name;
public Reporter(string name, string sex, int age, string hobby) : base(name, sex, age, hobby)
{
Console.WriteLine("我是Person的基类");
}
public void SetName(string name)
{
this.name = name;
}
public void Photo()
{
base.SayHello();//可以通过base调用父类的隐藏成员
Console.WriteLine("我在偷拍");
}
public void SayHello()//子类声明的成员,与父类的成员重名,父类的成员被隐藏
{
Console.WriteLine("我是{0},我{1}岁,我的爱好是{2}", name, age, hobby);
}
}
class Driver : Person
{
public Driver(string name, string sex, int age, string hobby) : base(name, sex, age, hobby)
{
Console.WriteLine("我是Person的基类");
}
public void PlayBasketball()
{
Console.WriteLine("我在打篮球");
}
}
class Programmer : Person
{
public Programmer(string name, string sex, int age, string hobby) : base(name, sex, age, hobby)
{
Console.WriteLine("我是Person的基类");
}
public void Movie()
{
Console.WriteLine("我在看电影");
}
}
#endregion
#region 里氏转换练习
//如果你定义了一个类,不希望别人继承,你可以将其密封 使用sealed关键字放在最前边
class Monster
{
protected string name;
public Monster(string name)
{
this.name = name;
}
protected int attack;
public void Attack()
{
Console.WriteLine("我是{0},我的攻击力{1},怕不怕", name, attack);
}
}
class Goblin : Monster
{
public Goblin(string name) : base("哥布林" + name)
{
attack = Program.roll.Next(, );
}
}
class Boss : Monster
{
public Boss(string name) : base("哥布林" + name)
{
attack = Program.roll.Next(, );
}
public void Skill()
{
Console.WriteLine("在我{0}面前颤抖吧,凡人,我的攻击力是{1}", name, attack);
}
}
#endregion
class Program
{
public static Random roll = new Random();
static void Main(string[] args)
{
#region 继承
//
Person p1 = new Person("老刘", "男", , "呵呵");
p1.SayHello();
Teacher t = new Teacher("老王", "男", , "教书");
t.SayHello();
t.Teach();
Console.WriteLine();
Reporter r = new Reporter("男性狗仔", "", , "偷拍");
r.SayHello();
r.Photo();
r.SetName("奥巴马");
r.SayHello();
Console.WriteLine();
Driver d = new Driver("张三", "男", , "打篮球");
d.SayHello();
d.PlayBasketball();
Programmer p = new Programmer("李四", "", , "看电影");
p.SayHello();
p.Movie();
//1、子类(Reporter)可以当父类(Person)用
//一个对象的实际类型是指他被构造出来时的类型
//2、如果父类中的实际对象是子类,我们可以将其转成子类
Reporter reporter = new Reporter("张三", "男", , "打篮球");//会退去子类所有的特性
Person reporterPerson = reporter;
reporterPerson.SayHello();
Reporter reporterPersonConvert = (Reporter)reporterPerson;
reporterPersonConvert.SayHello();
Person person = new Person("李四", "", , "看电影");
//Reporter personConvert = (Reporter)person;// 实际对象不是子类,强转会报错
//personConvert.SayHello();
//is关键字 可以帮助我们判定一个对象中是否包含另一个对象类型
//对象 is 包含的类型
if (reporterPersonConvert is Reporter)
{
Console.WriteLine("可以转换");
}
else
{
Console.WriteLine("不可以转换");
}
if (person is Reporter)
{
Console.WriteLine("可以转换");
}
else
{
Console.WriteLine("不可以转换");
}
//as关键字 尝试性转换,如果转换成功则返回对应类,不成功则返回null
//对象 as 尝试转换的类型
Person check = reporterPersonConvert;
Reporter reporterAS = check as Reporter;
reporterAS.SayHello();
#endregion
#region 里氏转换练习
Monster[] monsters = new Monster[];
for (int i = ; i < monsters.Length; i++)
{
if (i == )
{
//里氏转换第一原则 把子类当父类用
monsters[i] = new Boss("阿布");
}
else
{
monsters[i] = new Goblin(i + "号");
}
}
for (int i = ; i < monsters.Length; i++)
{
monsters[i].Attack();
if (monsters[i] is Boss)
{
((Boss)monsters[i]).Skill();
}
}
#endregion
}
}
}

C#学习笔记(十三):继承的更多相关文章

  1. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  2. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  3. c++学习笔记之继承篇

    title: c++学习笔记之继承篇 date: 2017-03-26 16:36:33 tags: [c++,继承,public,virtual,private,protected] categor ...

  4. Go语言学习笔记十三: Map集合

    Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...

  5. Vue学习笔记十三:Vue+Bootstrap+vue-resource从接口获取数据库数据

    目录 前言 SpringBoot提供后端接口 Entity类 JPA操作接口 配置文件 数据库表自动映射,添加数据 写提供数据的接口 跨域问题 前端修改 效果图 待续 前言 Vue学习笔记九的列表案例 ...

  6. Swift学习笔记十三:继承

    一个类能够继承(inherit)还有一个类的方法(methods),属性(property)和其他特性 一.基本的语法 class Human{ var name :String init(){ na ...

  7. java jvm学习笔记十三(jvm基本结构)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完 ...

  8. 1.8(java学习笔记)继承与方法的重写

    继承 在java中可以通过继承提高代码的复用率. 例如A继承了B,就可以是 例如,首先有一个类似Person,这个类中有有一些属性和方法,我们再新建一个Student类,其中有一部分属性和方法与Per ...

  9. C++学习笔记 封装 继承 多态 重写 重载 重定义

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

  10. 0022 Java学习笔记-面向对象-继承、多态、组合

    继承的特点 单继承:每个子类最多只有一个直接父类,注意是直接父类,间接父类个数不限 注意父类的概念:A-->B-->C-->D,在这里,ABC都是D的父类,C是D的直接父类,AB是D ...

随机推荐

  1. 【服务器】如何在服务器发布网站?Sasa讲解

    一.网站发布过程 1.可以在淘宝.万维网上买服务器,然后客服提供一个服务器的远程ip链接,我们通过我们电脑的远程去链接这个远程服务器就可以对这个服务器进行控制了.. 2.将待发布网站的程序在本地保存, ...

  2. 011-jdk1.8版本新特性三-Date API

    1.7.Date API Java 8 在包java.time下包含了一组全新的时间日期API.新的日期API和开源的Joda-Time库差不多,但又不完全一样,下面的例子展示了这组新API里最重要的 ...

  3. The Die Is Cast(poj 1481简单的双dfs)

    http://poj.org/problem?id=1481 The Die Is Cast Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  4. PAT 1017 Queueing at Bank[一般]

    1017 Queueing at Bank (25)(25 分)提问 Suppose a bank has K windows open for service. There is a yellow ...

  5. [LeetCode] 133. Clone Graph_ Medium tag: BFS, DFS

    Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...

  6. Look for the Air Jordan 32 in full family sizing

    Following the release of the 'Rosso Corsa' colorway, Jordan Brand is now set to officially launch th ...

  7. servlet07

    1.session验证 可以防止非登录的用户,通过在地址栏中输入地址,访问受保护的页面 step1.在用户登录成功之后,将用户的信息保存到session中 step2.在访问受保护的页面时,校验ses ...

  8. keras中TimeDistributed

    TimeDistributed这个层还是比较难理解的.事实上通过这个层我们可以实现从二维像三维的过渡,甚至通过这个层的包装,我们可以实现图像分类视频分类的转化. 考虑一批32个样本,其中每个样本是一个 ...

  9. python爬虫对于gb2312

    对于刚刚接触python爬虫的人,常常会碰到一个比较烦的问题, 如果网页是GB2312编码格式,我们直接decode(’GB2312‘)一般python都会报错: GB2312不能编码该页面. 这就比 ...

  10. python isinstance()与type()的区别

    例如在继承上的区别: isinstance() 会认为子类是一种父类类型,考虑继承关系. type() 不会认为子类是一种父类类型,不考虑继承关系. class A: pass class B(A): ...