请问在这两个方法有何区别?
其中虚方法的作用?
何时用方法一,何时用方法二?方法一:父类中使用虚函数,然后在子类中重写(override)
class A
{
public virtual void dosomething()
{
...........
}
}class B:A
{
public override void dosomething()
{
...........
}
}
----------------------------
方法二:父类中使用普通函数,然后在子类中隐藏(new)
class A
{
public void dosomething()
{
...........
}
}class B:A
{
public new void dosomething()
{
...........
}
}
其中虚方法的作用?
何时用方法一,何时用方法二?方法一:父类中使用虚函数,然后在子类中重写(override)
class A
{
public virtual void dosomething()
{
...........
}
}class B:A
{
public override void dosomething()
{
...........
}
}
----------------------------
方法二:父类中使用普通函数,然后在子类中隐藏(new)
class A
{
public void dosomething()
{
...........
}
}class B:A
{
public new void dosomething()
{
...........
}
}
static void Main(string[] args)
{
Test();
Console.ReadLine();
}
static void Test()
{
B b = new B();
b.dosomething();
A a = b;
a.dosomething();
D d = new D();
d.dosomething();
C c = d;
c.dosomething();
} class A
{
public virtual void dosomething()
{
Console.WriteLine("A.virtual");
}
} class B : A
{
public override void dosomething()
{
Console.WriteLine("B.override");
}
} class C
{
public void dosomething()
{
Console.WriteLine("C.Source");
}
} class D : C
{
public new void dosomething()
{
Console.WriteLine("D.NEW");
}
}
new被转回基类时,调用的是对象基类的方法
new还有一个特殊的地方,就是可以重写非虚函数
例如:
A objA = new B();
objA.dosomething();//Call B::dosomething method, not A::dosomething 而对于new来说,函数的调用不会产生多态,会根据定义类型而进行调用
例如:
A objA = new B();
objA.dosomething();//Call A::dosomething method, not B::dosomething 因此前者属于多态,属于后绑定,需要在运行的时候才能知道调用的是哪个类型方法;而后者属于静态绑定,在编译的时候已经确定了调用的类型方法。
override被转回基类时,调用的是用于创建对象的类的方法
new被转回基类时,调用的是对象基类的方法
new还有一个特殊的地方,就是可以重写非虚函数
说的够清楚了