gpt4 book ai didi

c# - 评论在 C# 中同时覆盖和被覆盖的方法?

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

场景是这样的

     public class Connection
{
public virtual void close()
{
/*Some code */
}
}

public interface IHttpRelay
{

void close();

}

public class HttpConnection: Connection,IHttpRelay
{
public /*keyword*/ void close()
{
base.close();
}
}

public class Http:HttpConnection
{
public override void close()
{
/*Some code */
}
}

我的问题是我是否应该在 HttpConnection 类中用 overridevirtual< 声明方法 close()/strong> 关键字,因为它覆盖并同时被覆盖。

最佳答案

你需要用override来标记它。如果您在 HttpConnection 中用 virtual 标记它,它将隐藏基类实现,而不是覆盖它。因此,它不能以多态方式使用。将一个方法标记为虚拟,其余的应该只是覆盖。

举个简单的例子

class A
{
public virtual void Frob()
{
Console.WriteLine("A");
}
}

class B : A
{
public virtual void Frob()
{
Console.WriteLine("B");
}
}

class C : B
{
public override void Frob()
{
Console.WriteLine("C");
}
}

这里,B重新定义了一个虚拟的Frob,它并没有覆盖。它遵循你的例子。但是,当通过 A 的引用使用 C 的实例时,会发生一些“意外”的事情。

A obj = new C();
obj.Frob(); // "A" is written to the screen, not "C"

写入屏幕的是“A”,您没有得到预期的多态行为。当您隐藏一个成员而不是覆盖它时,您只能通过隐藏类的引用获得新行为。当通过基类引用时,您会收到基本行为!这通常不是您在虚拟/覆盖多态场景中想要的。如果您将类 B 中的 virtual 替换为 override,然后运行上面的代码片段,输出就是您所期望的。

关于c# - 评论在 C# 中同时覆盖和被覆盖的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8368099/

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