gpt4 book ai didi

c# - 使用虚拟方法是否只有单实例生成的优势?

转载 作者:太空狗 更新时间:2023-10-29 23:09:10 29 4
gpt4 key购买 nike

我了解到虚方法的使用为方法/函数提供了默认行为。我的疑问是,当我们可以在派生类中使用“new”实现同名方法(如在基类中)并且可以分别由对象调用它时,虚方法有什么用。例如;

class A
{
public void F()
{
//default behavior
}

public virtual void G()
{
//default behavior
}
}

class B:A
{
new public void F()
{
//new behavior from that of class A
}
public override void G()
{
//new behavior from that of class A
}
}

class Test
{
public static void Main(string[] args)
{
//For calling A's method use same compile time and run time object
A obj1 = new A();

//For calling B's method use compile time object of A and run time of B
A obj2 = new B();

obj1.F(); //O/P is A's method result
obj2.F(); //O/P is A's method result
obj1.G(); //O/P is A's method result
obj2.G(); //O/P is B's method result
}

我的问题是,当我们可以通过使用类 A 和类 B 的相同编译时对象和运行时对象来提供默认行为和派生行为时,为什么需要类 A 中的虚拟 G():

A obj1 = new A(); //for calling A's methods
B obj2 = new B(); //for calling B's methods
A obj3 = new B(); //for having default behavior of class A using B's run time object.

我得到的只是在虚拟的情况下我们不需要再制作一个相同编译和运行时类型的对象。它可以通过一个单一的对象来实现,即类型A的编译时间和类型B的运行时间。

最佳答案

My question is why virtual G() in class A is needed when we can provide default behavior by using same compile time and run time object and derived behavior by using compile time object of A and run time of B.

因为这样你就可以使用已经知道B的代码。多态性的一半要点是允许您编写不关心它实际与哪个子类一起工作的代码。

例如,我可以使用 Stream.ReadStream.Write 编写一种方法将一个流的内容复制到另一个流,因为它们是虚拟的或抽象的方法。传入哪些实现并不重要。

你应该很少使用 new 作为方法修饰符 - 如果你真的想为非虚拟方法提供不同的行为,那么如果你创建一个完全不同的方法名称会更清楚,这样任何阅读代码的人都明白这是一个与基类中声明的方法完全不同的方法。

关于c# - 使用虚拟方法是否只有单实例生成的优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12853301/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com