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.返回值 ...
随机推荐
- 后台启动weblogic成功后,在web浏览器上无法访问
后台启动weblogic成功后,在web浏览器上无法访问,可尝试重启服务器.
- Gevent中信号量的使用
greenlet间同步方法:信号量 1.为什么引入信号量: 2.gevent信号量有哪些: 3.编程实现. 为何引入信号量 信号量是一个允许Greenlet相互合作,限制并发访问或运行的低层次的同步原 ...
- android native crash 分析
工具: addr2line arm-linux-androideabi-addr2line -aCfe libart.so 0x63006d 当libart.so包含符号表的情况下,可以查询到他的地址 ...
- RedHat下apache\ftp\mysql 4.0 的安装方法
RedHat下安装这三个服务的方法大同小异 Apache服务: 找到Apache安装包: rpm -ivh httpd-2.0.40-21.i386.rpm 等待安装完成即可 检查安装结果: rpm ...
- Unity3d调用iOS陀螺仪
How to write gyroscope controller with Unity3d http://blog.heyworks.com/how-to-write-gyroscope-contr ...
- DOM操作方法的简单归纳
(1)要在每个匹配的元素中插入新元素,使用: .append() .appendTo() .prepend() .prependTo() (2)要在每个匹配的元素相邻的位置上插入新元素,使用: . ...
- java使用代理 html2canvas 截屏 将页面内容生成图片
1.html2canvas 生成图片简单又好用,但涉及到跨域就会出现问题,官方给出的解决办法是设置代理.基本原理就是在后端将图片的数据生成base64再返回给前端使用.使canvas画布分析元素的时候 ...
- Web之路笔记之二 - CSS Positioning
CSS中控制各个Block element的位置方式之一,tag为position,有4种属性. 1. static 一般网页默认的属性,表示element根据页面正常流(normal flow)进行 ...
- java中使用sql的like关键字
String sql = "select * from userinfo where nickname like ?"; PreparedStatement ps = conn.p ...
- CSS的一些小技巧
1.黑白图像img.desaturate { filter: grayscale(100%); -webkit-filter: grayscale(100%); -moz-filter: graysc ...