我需要有关 "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"
- 谁能解释一下为什么?
- 我应该怎么做才能生产"Derived Entity visited"?我不想覆盖 "Accept" 函数。
重载在编译时解析,因此在编译您的 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
的额外阅读
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"
- 谁能解释一下为什么?
- 我应该怎么做才能生产"Derived Entity visited"?我不想覆盖 "Accept" 函数。
重载在编译时解析,因此在编译您的 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
的额外阅读