gpt4 book ai didi

c# - 我需要有关 "this"关键字和继承的帮助

转载 作者:行者123 更新时间:2023-11-30 14:47:50 25 4
gpt4 key购买 nike

abstract class BaseClass
{
public virtual void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}

class DerivedClass: BaseClass
{
}

interface IVisitor
{
void Visit(BaseClass baseEntity);
void Visit(DerivedClass derivedEntity);
}

class Visitor : IVisitor
{
public void Visit(DerivedClass derivedEntity)
{
Debug.WriteLine("Derived Entity visited");
}

public void Visit(BaseClass baseEntity)
{
Debug.WriteLine("Base Entity visited");
}
}

在上述声明之后

class Program
{
static void Main(string[] args)
{
DerivedClass derived = new DerivedClass();
Visitor visitor = new Visitor();
derived.Accept(visitor);
}
}

产生

"Base Entity visited"

不过我希望它能产生

"Derived Entity visited"
  • 谁能解释为什么?
  • 我应该怎么做才能产生“已访问派生实体”?我不想覆盖“接受”功能。

最佳答案

您在这里面临的问题是多重调度。编译器选择基类,因为您是从基类调用它的。您可以添加的一种快速解决方案是使用 dynamic:

public virtual void Accept(IVisitor visitor)
{
visitor.Visit(this as dynamic);
}

您欺骗编译器使其不知道对象的实际类型 - 并调用正确的 Visit 重载。

这里是来自 MSND 的一些额外阅读

关于c# - 我需要有关 "this"关键字和继承的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43130173/

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