重载就是多态的一种体现
多态的原理表述:一个父类可以有多个子类,父类是子类中方法的“交集”,子类中可以根据自己实际需要来加入新的方法,或则完善父类中的方法,当把子类的对象赋值给父类类型的对象时,这时候在调用同一个方法,就会根据子类中方法的不同,而得到不同的执行结果。
体现多态性的一个实例:面向对象程序设计中的另外一个重要概念是多态性。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。 可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。 如果这些对象都有同名方法,就可以调用每个对象的同名方法。
overload(重载):同一个类中,同名不同参数的方法,实现重载不用关键字,根据实际调用时候的实参来选择用哪种方法,(注:返回值不能区别函数是否重载),重载没有关键字。
override:父类中的虚方法,子类中来完善new:不同类中(基类或派生类)有两个或多个返回类型、方法名、参数都相同,但是方法体不同的方法(被隐藏父类方法可以通过调用得到)。
关于重载的实例:
public void Fun()
{
Console.WriteLine("我是没有参数的Fun方法,嘿嘿");
}
public void Fun(string input)
{
Console.WriteLine("我是带参数的Fun方法我叫"+input);
}
重载总结:同名不同参(参数类型),要问用哪个,根据参数(实际调用方法时使用的实参类型)来
关于重写的实例
class Father
{
public virtual void Say()
{
Console.WriteLine("我是父类中的虚方法");
}
}
class Daughter:Father
{
public override void Say()
{
// base.Say();
Console.WriteLine("有其父必有其女,我是女儿中的方法");
}
}
class Son : Father
{
public override void Say()
{
Console.WriteLine("虎父无犬子,我是儿子中的重写方法");
}
}
static void Main(string[] args)
{
Father f = new Father();
f.Say();
Daughter d = new Daughter();
d.Say();
Son s = new Son();
s.Say();
}
下面这个样子可以得到一样的结果
static void Main(string[] args)
{
Father[] team = new Father[2];
team[0] = new Daughter();
team[1] = new Son();
foreach (Father enen in team)
{
enen.Say();
}
}
上面个就是重写overide
重写总结:父类虚方法,子类来重写,既都为方法,功能均自全
1 重写是子类“完善”父类中的方法
2 父类的虚方法也是有实际功能的
3 virtual就是个标识,告诉子类这个父类的方法可以继续“完善”
备注:重写的基方法必须与override 方法具有相同的签名。重写的基方法必须是virtual、abstract
或 override 的,不能重写非虚方法或静态方法。
override的方法和virtual的方法必须具有相同的访问级别修饰符,不能更改virtual
方法的可访问性。不能使用new、static
或 virtual 修饰符来修改 override 方法。
new 覆盖
覆盖的意思就是写了一个新的函数,即使是名字参数都是一样的,那么在内存中也是完全不同的函数
上面的多态中之所以能用子类对象赋值给父类,然后再在这个对象中调用子类中的方法,是因为子类继承父类,实际上在内存中子类方法优先调用,不行再调用父类的
但是使用了new后,那么再用这儿方法就不能用父类对象调用子类方法了,因为这两个方法实质上已经不同了·
还是用个例子吧 还是上面那些类
代码是
static void Main(string[] args)
{
Father b = new Son();
b.Say();
}
得到的结果是这就是覆盖了··要自己体会··