Вызов метода базового базового класса
От: _nn_ www.nemerleweb.com
Дата: 02.01.11 09:48
Оценка: 6 (1)
C# не компилирует следующий код:
using System;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main()
        {
            var x = new C();
            x.foo();
        }
    }


    class A<T>
    {
        public virtual void foo()
        {
            System.Console.WriteLine("a");
        }
    }

    class B : A<object>
    {
        public override void foo()
        {
            base.foo();
            System.Console.WriteLine("b");
        }
    }

    class C : B
    {
        public override void foo()
        {
            (base as A<object>).foo(); // Так нельзя
            ((A<object>)base).foo(); // Так тоже нельзя

            System.Console.WriteLine("c");
        }
    }
}


Аналогичный код компилируют
  C++/CLI
using namespace System;

namespace ConsoleApplication5
{
    generic<class T>
    ref class A
    {
    public: virtual void foo()
        {
            System::Console::WriteLine("a");
        }
    };

    ref class B : A<System::Object^>
    {
    public: virtual void foo() override
        {
            __super::foo();
            System::Console::WriteLine("b");
        }
    };

    ref class C : B
    {
    public: virtual void foo() override
        {
            A<Object^>::foo();
            

            System::Console::WriteLine("c");
        }
    };

    
}
using namespace ConsoleApplication5;

int main(array<System::String ^> ^args)
{
    C^ x = gcnew C();
    x->foo();
    return 0;
}
и
  Nemerle
module Program
{
  Main() : void
  {
    def x = C();
    x.foo();
  }
}


class A[T] {
  public virtual foo () : void {
    System.Console.WriteLine ("a");
  }
}

class B : A[object]{
  public override foo () : void {
    base.foo ();
    System.Console.WriteLine ("b");
  }
}

class C : B {
  public override foo () : void {
    (base : A[object]).foo ();
    
    System.Console.WriteLine ("c");
  }
}


Выводит

a
c


Вопрос почему в C# нельзя приводить base к заданому типы, а в C++/CLI это разрешили ?

P.S.
С Новым Годом !
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.