C#类的继承,方法的重载和覆写
在网易云课堂上看到唐大仕老师讲解的关于类的继承、方法的重载和覆写的一段代码,注释比较详细,在此记下以加深理解。
小总结:
1、类的继承:允许的实例化方式:Student t=new Student(),Person p=new Person(),Person p2=t,具有学生属性的人类可以强制转换为学生类:Student t2=(Student)p2,但不可以Student t3=(Student)p;
2、方法的重载:基类方法重载只要求方法名称相同,返回类型、参数数目和参数类型都可以不相同;
3、方法的覆写:只有基类中有virtural修饰的方法才可以在子类中覆写,覆写不能改变基类方法的参数数目、参数类型和返回类型,只能覆写方法的具体实现。如果子类覆写了一个基类的方法,那么子类的实例在调用该方法时实际上调用的是被子类覆写后的方法。如果在基类中该方法有重载的其他方法,那么子类的实例在调用该方法名称时VS会提示有重载方法,此时可以根据函数的返回类型、参数数目和参数类型来确定具体调用的是基类还是子类的方法。简单的说,子类覆写基类的方法后,子类的实例调用该方法时调用的是子类的方法;
using System;
public class Person {
public string name; //定义域
public int age;
virtual public void SayHello(){ //定义方法 //virtual表示可以被子类override
Console.WriteLine("Hello! My name is " + name );
}
public void SayHello( Person another ){ //构造方法重载同名的sayHello方法
Console.WriteLine("Hello," + another.name +
"! My name is " + name );
}
public bool IsOlderThan( int anAge ){ //定义方法
bool flg;
if( age > anAge ) flg = true; else flg=false;
return flg;
}
public Person( string n, int a ){ //构造方法
name = n;
age = a;
}
public Person( string n ){ //构造方法重载
name = n;
age = -;
}
public Person( ):this( "", )//调用其他构造方法
{
}
} public class Student : Person //定义子类
{
public string school; //增加的字段
public int score = ;
public bool isGoodStudent(){ //增加的方法
return score>=;
}
override public void SayHello(){ //override覆盖父类的方法
base.sayHello();
Console.WriteLine( "My school is " + school );
}
public void SayHello( Student another ){ //增加的方法
Console.WriteLine("Hi!");
if( school == another.school )
Console.WriteLine(" Shoolmates ");
} public Student(){ //构造方法
}
public Student(string name, int age, string school )
: base( name, age ) //调用父类的构造方法
{
this.school = school;
} public void TestThisSuper(){
int a;
a = age; //本句与以下两句效果相同
a = this.age; //使用this
a = base.age; //使用base
} public static void Main( string [] arggs )
{
Person p = new Person( "Liming", );
Student s = new Student( "Wangqiang", , "PKU" );
Person p2 = new Student( "Zhangyi", , "THU" );
Student s2 = (Student) p2; //类型转换
}
}
*********************************************************************************
另外,提一下之前我在KD的面试题,关于类的继承、转换和方法调用:
假设有两个类,基类和子类:
class Person
{
public virtual string MethordA()
{
return "Person MethordA()";
}
}
class Student:Person
{
public override string MethordA()
{
return "Student MethordA()";
}
}
那么如下的方法会输出什么结果?
Person p = new Person();
Console.WriteLine("Person p = new Person();p.MethordA()--{0}", p.MethordA());
Student t = new Student();
Console.WriteLine("Student t = new Student();t.MethordA()--{0}", t.MethordA()); Person p2 = t;
Console.WriteLine("Person p2 = t;p2.MthordA()--{0}", p2.MethordA());
Student t2 = (Student)p2;
Console.WriteLine("Student t2 =(Student)p2;t2.MethordA()--{0}", t2.MethordA()); Student t3 =(Student)p;
Console.WriteLine("Student t2 =(Student)p;t2.MethordA()--{0}", t3.MethordA());
结果如下:

其中第11行代码会报错,不能将Person类型的p强制转换为Student。
C#类的继承,方法的重载和覆写的更多相关文章
- 【转】 Java多态特性:重载和覆写的比较
Java重载: 在同一个类中 方法具有相同的名字,相同或不同的返回值,但参数不同的多个方法(参数个数或参数类型) public class MethoDemo{ public static void ...
- Java多态特性:重载和覆写的比較
Java重载: 在同一个类中 方法具有同样的名字,同样或不同的返回值,但參数不同的多个方法(參数个数或參数类型) public class MethoDemo{ public static void ...
- javaSE练习13——(知识点:类的继承 方法的覆盖)
设计2个类,要求如下: (知识点:类的继承 方法的覆盖)1.定义一个汽车类Vehicle, 1.1 属性包括:汽车品牌brand(String类型).颜色color(String类型 )和速度spee ...
- java重载与覆写
很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参 ...
- Objective-c 类的继承 方法重写 方法重载
一.类的继承 Objective-c中类的继承与C++类似,不同的是Objective-c不支持多重继承,一个类只能有一个父类,单继承使Objective-c的继承关系很简单,易于管理程序. Obje ...
- java中的对象,类。与 方法的重载。
对象: 一切皆为对象.对象包括两部分内容:属性(名词形容词),行为(动词).对象和对象之间是有关系的: 派生,关联,依赖. 类: 对同一类别的众多对象的一种抽象.类,还是用来生成对象的一种模板,对象是 ...
- JS中的类,类的继承方法
大牛请无视此篇! 首先我们定义一个类,方法很简单,就像我们定义函数一样,只不过我们为了与函数区分,名称首字母要大写,看代码: function Person (){ } 这就是一个很简单的Poson类 ...
- JAVA笔记2__类/封闭性/构造方法/方法的重载/匿名对象
public class Main { public static void main(String[] args) { Chicken c1 = new Chicken(); Chicken c2 ...
- c++重载与覆写
重载:指子类改写了父类的方法,覆写:指同一个函数,同样的参数列表,同样的返回值的,但是函数内部的实现过程不同. 重载: 1.方法名必须相同. 2.参数列表必须不相同,与参数列表的顺序无关. 3.返回值 ...
随机推荐
- centos 7 编译zabbix 3.2.2
已有LNMP环境. 1.安装zabbix需要的依赖包,红色部门的包官方yum源没有,需要自己下载 yum install net-snmp fping iksemel net-snmp-devel ...
- 转:OSGi 入门篇:生命周期层
OSGi 入门篇:生命周期层 前言 生命周期层在OSGi框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或 ...
- What is SSL and what are Certificates?
Refer to http://www.tldp.org/HOWTO/SSL-Certificates-HOWTO/x64.html The content 1.2. What is SSL and ...
- null和undefined区别
undefined表示不存在的状态.没有定义的变量,没有定义的对象属性,没有return的函数的返回值等等都是undefined. null表示没有对象.使用上没有差别,只是根据大众的使用习惯,场合不 ...
- Centos6.5下的Hadoop安装
开始进行云计算部分的学习,为了存档,写下现在进行过的步骤 需要用到的主要版本: 虚拟机:Vmware Workstation pro 12.5 Linux系统:CentOS6.4 64bit jdk版 ...
- httplib用法
httplib的内容上是很多,也比较简单.以下是一个非常简单的例子,使用httplib获取google首页的html: import httplib conn = httplib.HTTPConnec ...
- django学习记录--第一个网页“hello django”
一.安装django 下面两种方法任选其一 1.pip或easy_install 安装 pip install django easy_install django 2.到django官网(https ...
- 通过php下载文件并重命名
$filename = dirname(__FILE__) . '/oldfilename.jpg'; $out_filename = 'newfilename.jpg'; if( ! file_ex ...
- canvas绘图
1.//获取canvas容器var can = document.getElementById('canvas');//创建一个画布var ctx = can.getContext('2d');2.绘 ...
- 对COM 组件的调用返回了错误 HRESULT E_FAIL
.net ppt转pdf时报以下错误: 对COM 组件的调用返回了错误 HRESULT E_FAIL 在服务器端打开PPT,选项--另存为--PDF,发现PowerPoint报了个错误: “无法找到打 ...