继承

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. URAL 1517 Freedom of Choice (后缀数组 输出两个串最长公共子串)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/whyorwhnt/article/details/34075603 题意:给出两个串的长度(一样长) ...

  2. python2与python3之间的主要区别

    python2与python3之间的主要区别 print py2:print语句,语句就意味着可以直接跟要打印的东西,如果后面接的是一个元组对象,直接打印 py3:print函数,函数就以为这必须要加 ...

  3. 获取Let`s Encrypt证书的三种方式

    1,acme.sh 方式 1)获取acme脚本 curl https://get.acme.sh | sh 2)开始获取证书 acme.sh强大之处在于,可以自动配置DNS,不用去域名后台操作解析记录 ...

  4. C# 定时器 一个简单 并且可以直接运行的Demo

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. Python + logging 输出到屏幕,将log日志写入文件

    日志 日志是跟踪软件运行时所发生的事件的一种方法.软件开发者在代码中调用日志函数,表明发生了特定的事件.事件由描述性消息描述,该描述性消息可以可选地包含可变数据(即,对于事件的每次出现都潜在地不同的数 ...

  6. Webform和MVC,为什么MVC更好一些?(转)

    转自http://www.admin10000.com/document/5277.html 前言 如果你看了最近微软的议程,你会发现他们现在的焦点除了MVC,还是MVC.问题在于为什么微软如此热衷于 ...

  7. Filter过滤器与Session会话跟踪技术

    Filter过滤器 适用场景 1.为web应用程序的新功能建立模型(可被添加到web应用程序中或者从web应用程序中删除而不需要重写基层应用程序代码)2.用户授权Filter:负责检查用户请求,根据请 ...

  8. 20165207 Exp4 恶意代码分析

    目录 1.实验内容 1.1.系统运行监控 1.1.1.使用命令行创建计划任务 1.1.2.使用命令行借助批处理文件创建计划任务 1.1.3.分析netstat计划任务的最终结果 1.1.4.安装配置s ...

  9. 20145316《网络对抗》Exp9 Web安全基础实践学习总结

    20145316<网络对抗>Exp9 Web安全基础实践学习总结 基础问题回答 SQL注入攻击原理,如何防御 SQL注入,就是攻击者通过把SQL命令插入到Web表单递交或输入域名或页面请求 ...

  10. echart知识点、常用图形

    原文地址:https://www.cnblogs.com/kewenxin/p/9338272.html 本文是自己在项目中需要运用到的echarts图形进行整理,都有完整的代码.echarts原型, ...