继承,is,as,多态
继承中的构造方法:
1、创建子类对象时,一定会先创建父类对象
2、如果调用的子类构造方法没有使用base,就会自动调用父类无参的构造方法,
如果父类没有无参的构造方法就会报错
3、如果调用的子类构造方法使用了base,就会根据base后面的参数调用父类对应的构造方法
注意:如果类中有定义有参的构造方法,建议把无参的构造方法也写出来
里氏替换原理:子类对象能替换父类对象,父类对象不能替换子类对象
is:判断类型是否匹配、兼容
as:对引用类型进行类型转换(特点:转换失败不会报异常,而是返回一个null)
强制转换:转换失败会抛出异常
/// <summary>
/// 父类
/// </summary>
class Person
{
//姓名
public string Name { get; set; }
//年龄
public int Age { get; set; }
//职业
public string Job { get; set; }
//注意:如果类中有定义有参的构造方法,建议把无参的方法也写出来
public Person() { Console.WriteLine("Person的无参构造方法被调用了!"); }
public Person(string name, int age,string job)
{
this.Name = name;
this.Age = age;
this.Job = job;
Console.WriteLine("Person带3个参数的构造方法被调用!");
}
public void Eat()
{
Console.WriteLine("吃饭");
}
public void Sleep()
{
Console.WriteLine("睡觉");
}
}
//子类
class Student:Person
{
//特长
public string Special { get; set; }
//学习
public void Study()
{
Console.WriteLine("学习");
}
}
class Teacher:Person
{
//教龄
public int TeachYear { get; set; }
public Teacher()
{
Console.WriteLine("Teacher无参构造方法被调用!");
}
public Teacher(string name,int age,string job,int teachYear):base(name,age,job)
{
this.TeachYear = teachYear;
Console.WriteLine("Teacher带四个参数的构造方法被调用!");
}
public new void Eat()
{
Console.WriteLine("老师吃饭");
}
public void Teach()
{
Console.WriteLine("教书");
}
}
//使用
class Program
{
//继承中的构造方法
//static void Main(string[] args)
//{
// //Teacher teacher = new Teacher();
// Teacher teacher = new Teacher("张三",23,"程序员",2);
// teacher.Eat();
//}
//is:判断类型是否匹配、兼容
//static void Main(string[] args)
//{
// Student stu = new Student();
// Console.WriteLine(stu is Student);//true
// Console.WriteLine(stu is Teacher);//false
// Console.WriteLine(stu is Person);//true
//}
//里氏替换原理
//static void Main(string[] args)
//{
// Person p1 = new Person();
// Person p2 = new Teacher();//正确,子类对象替换父类对象
// Teacher t = new Teacher();
// Teacher t2 = new Person();//错误,父类对象不能替换子类对象
//}
//as:对引用类型进行类型转换(特点:转换失败不会报异常,而是返回一个null)
static void Main(string[] args)
{
Person p = new Teacher();
//Console.WriteLine(p.TeachYear);//出错,因为p无法访问TeachYear(因为编译器认为p为Person类型)
Console.WriteLine((p as Teacher).TeachYear);//正确,因为p已经转换为了Teacher
Console.WriteLine(p as Student);//转换失败,结果为null
Console.WriteLine((Student)p);//转换失败,出现异常
}
}
继承,is,as,多态的更多相关文章
- Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态
一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...
- java中静态属性和和静态方法的继承问题 以及多态的实质
首先结论是:java中静态属性和和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成的,不需继承机制就可以调用如果子类里 ...
- python基础之继承原理,多态与封装
1.什么是继承? 继承是一种创建新的类的方式.class A: passclass B: pass2.如何继承---->如何寻找继承关系 现实生活中找继承关系是自下而上,在程序中写是自上而下继承 ...
- (C/C++学习)5.C++中的虚继承-虚函数-多态解析
说明:在C++学习的过程中,虚继承-虚函数经常是初学者容易产生误解的两个概念,它们与C++中多态形成的关系,也是很多初学者经常产生困惑的地方,这篇文章将依次分别对三者进行解析,并讲述其之间的联系与不同 ...
- 初识面向对象(钻石继承,super,多态,封装,method,property,classmethod,staticmethod)
组合 什么有什么的关系 一个类的对象作为另一个类的对象继承 子类可以使用父类中的名字(静态属性 方法)抽象类和接口类 只能不继承,不能被实例化 子类必须实现父类中的同名方法———规范代码 metacl ...
- [Objective-C] 004_继承封装与多态
继承 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展.通过继承创建的 ...
- Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法/多态
python的面向对象 面向对象与面向过程 面向过程 面向过程思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码(自己来做) 面向对象 面向对象的三 ...
- JavaScript 面向对象程序设计(下)——继承与多态 【转】
JavaScript 面向对象程序设计(下)--继承与多态 前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员.公有实例成员.私有静态成员.公有静态成员和静态类的封装.这次我们来讨论 ...
- 初步理解Java的三大特性——封装、继承和多态
声明:整理自网络,如有雷同,请联系博主处理 一.封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被 ...
- 继承多态绕点 Java篇
上一篇把C#语言的继承,多态里的特殊的情况做了一下总结,其实那一部分代码都是从Java翻译过去的,今天来总结一下Java在这种情况下是怎么调用的. 上一篇我们说的是:1.多态,只在多态系里方法调用,很 ...
随机推荐
- POJ2299 Ultra-QuickSort 【树阵】+【hash】
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 39529 Accepted: 14250 ...
- 【DataStructure】Some useful methods for arrays
Last night it took me about two hours to learn arrays. For the sake of less time, I did not put emph ...
- Qt Quick 布局演示
于 Qt Widgets 于,我们经常使用许多布局管理器来管理界面 widgets . 于 Qt Quick 实际上,有两个相关的管理和布局库,所谓集 Item Positioner ,所谓集 Ite ...
- android tv 全屏幕垂直画
它们的定义view 采纳canvas双缓冲方式,它可以减少呈现时间.提高性能. StaggeredView.java 源码例如以下: package com.xxx.demo; import andr ...
- 为代码减负之<二>存储过程(SQL)
在上篇博客中介绍到了触发器的使用,而且当中也提到了触发器是个特殊的存储过程,那么什么是存储过程呢?他们 两个又究竟有什么差别呢? 事实上最基本的差别就是,触发器是当满足条件时系统自己主动运行的,而存储 ...
- easyUI的combobox实现级联
先简介下combobox: easyUI重写了select,取而代之的是combobox,有例如以下几种方式能够创建一个combobox 1.使用select标签,并加上class="eas ...
- flex builder 4.7 ios 该溶液无法找到设备
行政建议,没有设备 1) 视图itunes 该服务正在启动(Bonjour服务).测试..... .即使没有这样的假设 2)"D:\Program Files\Adobe\Adobe Fla ...
- Fun<>,匿名方法,Lambda表达式 冒泡排序C#
大头文 分享,进步 冒泡排序C#实现,使用委托,包括三种方式:Fun<>,匿名方法,Lambda表达式 冒泡排序是一种简单的排序方法,适合于小量数字排序,对于大量数字(超过10个),还有更 ...
- 浅谈 js 数字格式类型
原文:浅谈 js 数字格式类型 很多人也许只知道 ,123.456,0xff 之类的数字格式.其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有人说这是 ...
- C# 获取与解析枚举类型的 DescriptionAttribute
原文:C# 获取与解析枚举类型的 DescriptionAttribute System.ComponentModel.DescriptionAttribute 这个 Attribute,经常被用来为 ...