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

i need help on "this" keyword and inheritance

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");
    }
}

经过上述declerations

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

生产

"Base Entity visited"

不过我希望它能产生

"Derived Entity visited"

重载在编译时解析,因此在编译您的 BaseClass 时,编译器将选择与其编译时类型 (BaseClass) 匹配的 Visitor.Visit 重载。

使用访问者模式时,您通常会希望在派生的 类.

中覆盖 Accept 方法

虽然您可以使用 dynamic 避免这种情况,但如果这样做,您将失去静态类型检查的优势。

This article 显示了 C# 中访问者模式的示例,其中 Accept 方法在派生的 类.

中被覆盖

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

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

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

这里有一些来自 MSND

的额外阅读