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.返回值 ...
随机推荐
- 使用Asp.Net Core Identity给用户添加及删除角色
基于Asp.Net Core编制一个项目,需要给用户添加及删除角色的功能,于是使用到了Identity中的UserManager. 先后解决了几个问题,终于实现了设想. 1. 环境条件 Asp.Net ...
- Java开源BI系统介绍(转)
http://blog.csdn.net/boboo_2000_0/article/details/4810420 BI解决方案中的工具 一个完整的BI解决方案中有多种工具来完成BI系统中各个阶段的工 ...
- zookeeper、kafka、storm install
安装顺序 zookeeper,kafka,storm install zookeeper 1.上传tar包,解压tar tar -zxvf zookeeper-3.4.6.tar.gz 2.复制 ...
- Map的五种遍历方法
package com.jackey.topic; import java.util.ArrayList;import java.util.HashMap;import java.util.Itera ...
- comparator接口与compare方法的实现
刷leetcodecode时看到一道题需要利用自定义的比较器进行排序,最开始一头雾水,看了API终于懂了~ Arrays.sort(T[] a,Comparator<? super T> ...
- django学习记录--第一个网页“hello django”
一.安装django 下面两种方法任选其一 1.pip或easy_install 安装 pip install django easy_install django 2.到django官网(https ...
- 【Duke-Image】Week_4 Image restoration
Chapter 5 Image Restoration and Reconstruction 图像复原与重建 5.1 A Model of the Image Defradation/Restorat ...
- yii2-basic后台管理功能开发之四:图片上传FileInput
我采用的是 kartik-v/yii2-widget-fileinput的文件上传插件,大家可以去github查看详细的安装方法和使用说明. 需求:上传图片+可以预览缩略图 在这里说说我碰到的问题:限 ...
- first Automation
//创建一个容器 CEmbWordCntrItem * pItem = NULL; CEmbWordDoc * pDoc = GetDocument(); pItem = new C ...
- MYSQL命令行使用指南
一.连接MYSQL. 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -u ...