代码:
public abstract class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
} public class B: A
{
public B()
{
Console.WriteLine('B');
} public new void Fun()
{
Console.WriteLine("B.Fun()");
} public static void Main()
{
A a = new B();
a.Fun();
}
}
public class C: A
{
public C()
{
Console.WriteLine('C');
} public override void Fun()
{
Console.WriteLine("C.Fun()");
} public static void Main()
{
A a = new B();
a.Fun();
a=new C();
a.Fun();
}
} 执行结果:
A
B
A.Fun()
A
C
C.Fun()
从结果可以看到new关键字修饰的方法没有被执行,而执行了基类的方法。这是为什么啊?不是说new会隐藏基类方法吗
而override却执行了本类的方法
public abstract class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
} public class B: A
{
public B()
{
Console.WriteLine('B');
} public new void Fun()
{
Console.WriteLine("B.Fun()");
} public static void Main()
{
A a = new B();
a.Fun();
}
}
public class C: A
{
public C()
{
Console.WriteLine('C');
} public override void Fun()
{
Console.WriteLine("C.Fun()");
} public static void Main()
{
A a = new B();
a.Fun();
a=new C();
a.Fun();
}
} 执行结果:
A
B
A.Fun()
A
C
C.Fun()
从结果可以看到new关键字修饰的方法没有被执行,而执行了基类的方法。这是为什么啊?不是说new会隐藏基类方法吗
而override却执行了本类的方法
举个例子,假设马有个速度属性,速度50-80公里/小时,千里马也有个速度属性,为120公里/小时.
当你把千里马当做普通马来用的话,那么如果想要知道它的速度属性就应该是50-80而不是120,因为120是千里马的特殊性,而不能代表马的普遍性,
比如你这么写:马 ma = new 千里马();
只有当你把千里马当作一个特定的示例来用,才可以说它的速度属性是120,
比如你这么写: 千里马 QLma = new 千里马();
比如你这么写:马 ma = new 千里马();
假如你是伯乐呢,你知道这是一个千里马,而且也把它当千里马来用,别人问你呢,你就会说是120 呵呵
比如你这么写: 千里马 QLma = new 千里马();这么说可能比较容易理解吧。
其实用override 重写以后呢,是相当于这样的。
当你把千里马当做普通马来跑,嘿嘿,不管你是不是伯乐,因为它是千里马的特殊性,它跑起来都是可以达到120公里/小时
上面代码应这样写标准一些:
public abstract class A
{
public A()
{
Console.WriteLine( 'A ');
}
public virtual void Fun()
{
Console.WriteLine( "A.Fun() ");
}
} public class B: A
{
public B()
{
Console.WriteLine( 'B ');
} public new void Fun()
{
Console.WriteLine( "B.Fun() ");
}
}
public class C: A
{
public C()
{
Console.WriteLine( 'C ');
} public override void Fun()
{
Console.WriteLine( "C.Fun() ");
}
}
执行:
private void button8_Click(object sender, System.EventArgs e)
{
A a = new B();
a.Fun();
a=new C();
a.Fun();
}执行结果:
A
B
A.Fun()
A
C
C.Fun()
a.Fun();的结果是不一样的。
而用override,你用A a = new B(); B a = new B();
a.Fun();的结果是一样的。
那个new是互相隐藏的。
但 不是扩展继承成员的实现.
而override 则扩展继承成员的实现.
所以new过的方法是不可以通过基类调用的
overwrite 是彻底覆盖基类方法
B a = new B();
a.Fun();就是 "B.Fun()" 了.这是面向对象的基础知识
你是说new 是在本类写一个与基类同名的方法,而override是把基类的同名方法给干掉了后产生自己的新方法。所以new的方法和本类的其它正常的方法(即和基类没有关系的方法)一样用,就象没有基类一样。而基类的virtual方法也正常使用,是这样吗?