在网易云课堂上看到唐大仕老师讲解的关于类的继承、方法的重载和覆写的一段代码,注释比较详细,在此记下以加深理解。

小总结:

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#类的继承,方法的重载和覆写的更多相关文章

  1. 【转】 Java多态特性:重载和覆写的比较

    Java重载: 在同一个类中 方法具有相同的名字,相同或不同的返回值,但参数不同的多个方法(参数个数或参数类型) public class MethoDemo{ public static void ...

  2. Java多态特性:重载和覆写的比較

    Java重载: 在同一个类中 方法具有同样的名字,同样或不同的返回值,但參数不同的多个方法(參数个数或參数类型) public class MethoDemo{ public static void ...

  3. javaSE练习13——(知识点:类的继承 方法的覆盖)

    设计2个类,要求如下: (知识点:类的继承 方法的覆盖)1.定义一个汽车类Vehicle, 1.1 属性包括:汽车品牌brand(String类型).颜色color(String类型 )和速度spee ...

  4. java重载与覆写

    很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参 ...

  5. Objective-c 类的继承 方法重写 方法重载

    一.类的继承 Objective-c中类的继承与C++类似,不同的是Objective-c不支持多重继承,一个类只能有一个父类,单继承使Objective-c的继承关系很简单,易于管理程序. Obje ...

  6. java中的对象,类。与 方法的重载。

    对象: 一切皆为对象.对象包括两部分内容:属性(名词形容词),行为(动词).对象和对象之间是有关系的: 派生,关联,依赖. 类: 对同一类别的众多对象的一种抽象.类,还是用来生成对象的一种模板,对象是 ...

  7. JS中的类,类的继承方法

    大牛请无视此篇! 首先我们定义一个类,方法很简单,就像我们定义函数一样,只不过我们为了与函数区分,名称首字母要大写,看代码: function Person (){ } 这就是一个很简单的Poson类 ...

  8. JAVA笔记2__类/封闭性/构造方法/方法的重载/匿名对象

    public class Main { public static void main(String[] args) { Chicken c1 = new Chicken(); Chicken c2 ...

  9. c++重载与覆写

    重载:指子类改写了父类的方法,覆写:指同一个函数,同样的参数列表,同样的返回值的,但是函数内部的实现过程不同. 重载: 1.方法名必须相同. 2.参数列表必须不相同,与参数列表的顺序无关. 3.返回值 ...

随机推荐

  1. PHPStorm技巧篇 -- 全局搜索

    自定义快捷键,找到search everywhere 我绑定的是alt+N 设置好并apply后,在项目中使用:快捷键alt+N ,输入自己需要查找的文件或类名或方法名,即可出现相应的选项. so c ...

  2. 基于Eclipse+Cordova的Android Hybrid应用开发环境搭建

    环境说明 操作系统:Windows 7 64位 Eclipse版本:4.5.2 Release(eclipse-jee-mars-2) JDK版本:1.8 搭建步骤 1.从http://www.ecl ...

  3. nodejs的第三天学习笔记

    一. CommonJS 规范 1.1nodejs 与 commonjs 之间的关系: 1)nodejs是一种服务器语言. a)开启服务的能力 b)文件读写的能力 服务器:就是一台安装了服务软件 2)c ...

  4. 关于如何使用Identity的文献

    有几篇文件,深入浅出地讲解了如何一步一步的使用Identity,感觉十分有用,留下链接,备查. 1. Configuring Db Connection and Code-First Migratio ...

  5. 仿W8屏保

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 20169212《Linux内核原理与分析》第十一周作业

    缓冲区溢出漏洞实验 缓冲区溢出漏洞:缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器 ...

  7. 20169212《Linux内核原理与分析》第八周作业

    理论 task_struct的结构关系 非常庞大的数据结构,400多行代码.包括对进程链表的管理,控制台,文件系统描述,文件描述符,内存管理描述,信号描述等. 创建一个新进程在内核中的执行过程 for ...

  8. Codeforces Round #374 (Div. 2) D. Maxim and Array

    传送门 分析:其实没什么好分析的.统计一下负数个数.如果负数个数是偶数的话,就要尽量增加负数或者减少负数.是奇数的话就努力增大每个数的绝对值.用一个优先队列搞一下就行了. 我感觉这道题的细节极为多,非 ...

  9. uva 10801(最短路)

    题目大意: 有一层不超过100层的大楼, 有n个电梯,它们的速度都不同. 而且每个电梯只能到达指定的那些楼层,而且它们都有各自的速度(即上升一层或下降一层所用的时间). 如果一个人在某层走出电梯,要换 ...

  10. Thrift入门及Java实例演示<转载备用>

    Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...