我需要有关“此”关键字和继承的帮助

穆斯塔法·杜曼(Mustafa Duman)
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的一些额外读物

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章