黑马程序员技术交流社区
标题:
关于两种重写父类方法
[打印本页]
作者:
伪善者。
时间:
2014-4-27 21:13
标题:
关于两种重写父类方法
本帖最后由 伪善者。 于 2014-4-28 00:34 编辑
看视频中讲到 重写父类的方法的时候 一种是在子类方法的 访问修饰符后加 new
另一种是声明父类的虚方法 再用override重写
请问这两种方法有何不同?优劣何在?谢谢
作者:
Invoker
时间:
2014-4-27 22:13
一个override 是重写
一个new 是显示隐藏基类
如果基类的方法是virtual 的。
所以子类必须重写基类的方法,也就是必须隐藏基类的方法。
给你看下区别的代码
using System ;
public class MyBase
{
public static int x = 55 ;
public static int y = 22 ;
}
public class MyDerived : MyBase
{
new public static int x = 100; // 利用new 隐藏基类的x
public static void Main()
{
// 打印x:
Console.WriteLine(x);
//访问隐藏基类的 x:
Console.WriteLine(MyBase.x);
//打印不隐藏的y:
Console.WriteLine(y);
}
}
//这个是调用父类的方法
using System;
public class Parent
{
string parentString;
public Parent()
{ Console.WriteLine("Parent Constructor."); }
public Parent(string myString)
{
parentString = myString;
Console.WriteLine(parentString);
}
public void print()
{ Console.WriteLine("I'm a Parent Class."); }
}
public class Child : Parent
{
public Child()
: base("From Derived")
{ Console.WriteLine("Child Constructor."); }
public void print()
{
base.print();
Console.WriteLine("I'm a Child Class.");
}
public static void Main()
{
Child child = new Child();
child.print();
((Parent)child).print();
}
}
复制代码
作者:
小狸
时间:
2014-4-27 23:26
本帖最后由 小狸 于 2014-4-28 01:07 编辑
当子类从基类继承时,它会获得基类的所有方法、字段、属性和事件。若要更改基类的数据和行为,有两种方法:
1.override 重写虚拟的基类方法;
2.new 使用新的派生成员替换基类的方法;
两者的区别在于。override 会直接“覆盖掉基类的方法”;而new后,没有使用到基类的方法,而是直接重新定义了子类的方法。
例如:
using System;
using System.Text;
namespace over
{
class Program
{
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
DerivedClass dc = new DerivedClass();
BaseClass bcdc = new DerivedClass();//使用子类的对象实例化基类的对象;
bc.Method1();
bc.Method2();
dc.Method1();
dc.Method2();
bcdc.Method1();
bcdc.Method2();
Console.ReadLine();
}
}
class BaseClass
{
public virtual void Method1() //基类虚方法1
{
Console.WriteLine("基类.Method1");
}
public virtual void Method2() //基类虚方法2
{
Console.WriteLine("基类.Method2");
}
}
class DerivedClass : BaseClass
{
public override void Method1() //override
{
Console.WriteLine("子类.Method1");
}
public new void Method2() //new
{
Console.WriteLine("子类.Method2");
}
}
}
复制代码
结果为:基类.Method1
基类.Method2
子类.Method1
子类.Method2
子类.Method1
基类.Method2
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2