В следующем коде я ожидал, что вызов a.Generate(v)
приведет к вызову V.Visit(A a)
, поскольку при вызове Generate this
имеет тип A. Однако, похоже, что this
воспринимается как Inter
.
Можно ли добиться желаемого поведения без явной реализации (идентичного) метода в A
и B
, а только на общем базовом классе? Если да, то как этого можно добиться?
using System;
using System.Diagnostics;
namespace Test {
class Base {}
class Inter: Base {
public virtual void Generate(V v) {
// `Visit(Base b)` and not `Visit(A a)` is called when calling
// A.Generate(v). Why?
v.Visit(this);
}
}
class A: Inter {}
class B: Inter {}
class V {
public void Visit(Base b) { throw new NotSupportedException(); }
public void Visit(A a) { Trace.WriteLine("a"); }
public void Visit(B b) { Trace.WriteLine("b"); }
}
class Program {
static void Main() {
V v = new V();
A a = new A();
B b = new B();
a.Generate(v);
b.Generate(v);
}
}
}
Редактировать.
В ответах было высказано предположение, что приведенный выше код не является полиморфным. Я бы возразил против этого. V.Visit
является полиморфным.