C#多态 重载 虚方法 重写
2011-12-02 10:30
302 查看
抽象类用abstract 修饰 同样方法用abstract修饰的就是抽象方法。
抽象类不能实例化。
抽象类可以包含抽象方法和抽象访问器。
不能用
sealed 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。
采用 sealed
修饰符的类无法继承,而 abstract修饰符要求对类进行继承。
重载 overload修饰(参数的个数不一致,参数的类型不一致,方法名相同)与方法的返回类型无关,重载一般发生在同一个类里。
重写(字面意思就是重新实现) Override 是对父类的方法进行实现,这个“重新设计”的的基础是方法名和参数完全一致,但是内部实现体不一样。
重写一般发生在父类和子类之间,一般父类定义一个虚方法或抽象方法,子类根据具体情况“重写”其中的实现。
override方法和
virtual方法必须具有相同的访问级别修饰符。
虚方法用virtual修饰 ,它们可以在派生类中被重写(override)。例如,此方法可被任何继承它的类重写。
virtual修饰符不能与
static、abstract,private或
override修饰符一起使用
const关键字用于修改字段或局部变量的声明。
它指定字段或局部变量的值是常数,不能被修改。
sealed 当对一个类应用sealed
修饰符时,此修饰符会阻止其他类从该类继承。
最后一个new和 virtual/override的区别 看个例子(csdn的例子 我觉的写的很好!)
new 用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。
New和Override这两个关键字是互斥的。不可以同时使用。
Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名,此关键字不可以用于重写非虚方法和静态方法,与其配套使用的关键字是Virtual、abstract、Override。与此同时,Override方法还不可以修改Virtual方法的可访问性,Override方法和Virtual方法必须具有相同的访问修饰符,不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。
class Program
{
static void Main(string[] args)
{
contact ct1 = new class1();
contact ct2 = new class2();
class2 sp = new class2();
sp.prinf();
ct1.prinf();
ct2.prinf();
}
}
abstract public class contact
{
public virtual void prinf()
{
Console.WriteLine("这是虚方法");
}
}
public class class1 : contact
{
public override void prinf()
{
Console.WriteLine("这是个重写的新方法");
}
}
public class class2 : contact
{
public new void prinf()
{
Console.WriteLine("这是另一个新的方法");
}
}
结果:
这是另一个新的方法;
这是个重写的新方法
这是虚方法
一万年太久,只争朝夕 大丈夫处世 立功名 得富贵 就在今朝
生活若是习惯了 就会消磨一个人的意志 失去上进心 最后变成了麻木的阿Q
抽象类不能实例化。
抽象类可以包含抽象方法和抽象访问器。
不能用
sealed 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。
采用 sealed
修饰符的类无法继承,而 abstract修饰符要求对类进行继承。
重载 overload修饰(参数的个数不一致,参数的类型不一致,方法名相同)与方法的返回类型无关,重载一般发生在同一个类里。
重写(字面意思就是重新实现) Override 是对父类的方法进行实现,这个“重新设计”的的基础是方法名和参数完全一致,但是内部实现体不一样。
重写一般发生在父类和子类之间,一般父类定义一个虚方法或抽象方法,子类根据具体情况“重写”其中的实现。
override方法和
virtual方法必须具有相同的访问级别修饰符。
虚方法用virtual修饰 ,它们可以在派生类中被重写(override)。例如,此方法可被任何继承它的类重写。
virtual修饰符不能与
static、abstract,private或
override修饰符一起使用
const关键字用于修改字段或局部变量的声明。
它指定字段或局部变量的值是常数,不能被修改。
sealed 当对一个类应用sealed
修饰符时,此修饰符会阻止其他类从该类继承。
最后一个new和 virtual/override的区别 看个例子(csdn的例子 我觉的写的很好!)
new 用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。
New和Override这两个关键字是互斥的。不可以同时使用。
Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名,此关键字不可以用于重写非虚方法和静态方法,与其配套使用的关键字是Virtual、abstract、Override。与此同时,Override方法还不可以修改Virtual方法的可访问性,Override方法和Virtual方法必须具有相同的访问修饰符,不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。
class Program
{
static void Main(string[] args)
{
contact ct1 = new class1();
contact ct2 = new class2();
class2 sp = new class2();
sp.prinf();
ct1.prinf();
ct2.prinf();
}
}
abstract public class contact
{
public virtual void prinf()
{
Console.WriteLine("这是虚方法");
}
}
public class class1 : contact
{
public override void prinf()
{
Console.WriteLine("这是个重写的新方法");
}
}
public class class2 : contact
{
public new void prinf()
{
Console.WriteLine("这是另一个新的方法");
}
}
结果:
这是另一个新的方法;
这是个重写的新方法
这是虚方法
一万年太久,只争朝夕 大丈夫处世 立功名 得富贵 就在今朝
生活若是习惯了 就会消磨一个人的意志 失去上进心 最后变成了麻木的阿Q
相关文章推荐
- 多态方法、重载、重写的区别
- PHP面向对象编程之--多态:方法重载与重写
- c#中多态的学习与使用方法以及重写(覆盖)和重载的区别
- 构造器、方法重载、继承、方法重写、自动转型、多态课堂笔记
- JAVA【类】析构器、重载与继承、方法的重写、自动转型、多态、方法与类的分类、接口继承
- Java之面向对象例子(三) 多态,重写,重载,equals()方法和toString()方法的重写
- 初识c#---多态(方法重载,方法重写,里氏替换原则)抽象,接口
- 类、对象、继承、封装、多态、方法的重载和重写、Java的访问修饰符与其它关键字
- 多态中方法的重写和方法的重载
- 封装,构造方法,重载,重写,多态
- 重载、重写、虚方法、抽象方法、隐藏方法小记---C#多态
- JAV中一些基本概念:构造函数、方法重载、继承、方法重写、多态。
- 面向对象,类的组合关系,继承,实现,方法重写,方法重载,this的使用,抽象方法和抽象类的比较,父类构造方法存在的意义,多态的是用和解析,各种访问修饰符
- 通过Object类说明方法重载、方法重写、多态之间的关系
- 方法的重载、重写及抽象类和里氏替换原则
- 方法的重写和重载
- 【Java基础之多态中静态方法重写问题】java中静态方法的重写问题详解
- 第一章.对象导论之方法的重写和重载
- JAVA 方法的重写和方法的重载
- 浅谈Java中的重载,重写,多态,静态绑定、动态绑定