Как полиморфизм работает с неопределенными промежуточными типами в C#?

В следующем коде я ожидал, что вызов 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 является полиморфным.

7
задан joce 26 March 2013 в 23:29
поделиться