2014-01-03 3 views
2

Я экспериментирую с C#, и я построил следующую программу (см. Ниже).Динамический тип и статический тип C#

Я понимаю, что динамический и статический тип first - C. Для second динамический тип также C, но статический тип A. Теперь я задаюсь вопросом, где это может пригодиться?

Я заметил также (очевидно), что визуальная студия не позволяет мне звонить second.CallA().

Теперь обратите внимание, что при вызове DoA() для всех трех типов статического типа динамический тип - C. Как это имеет место, почему this не указывает на этот класс? Если я назову правильный (я мог бы ошибаться) в Java, то self.methodA() начнет искать дерево наследования из экземпляра вызывающего. Как кажется, это не так. Могу ли я создать такое поведение или это ограничение языка?

public class A 
{ 
    public void methodA() 
    { 
     Console.WriteLine("I am class A!"); 
    } 
    public void DoA() 
    { 
     Console.Write("The type of this: " + this.GetType() + " - "); 
     this.methodA(); 
    } 
} 
public class B : A 
{ 
    public void methodA() 
    { 
     Console.WriteLine("I am class B!"); 
    } 
} 
public class C : B 
{ 
    public void methodA() 
    { 
     Console.WriteLine("I am class C!"); 
    } 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 
     C first = new C(); 
     A second = new C(); 
     dynamic third = new C(); 

     //Show the types of both 

     Console.WriteLine(first.GetType() + "\n" + second.GetType() + "\n" + third.GetType()); 
     first.methodA(); 
     second.methodA(); 
     third.methodA(); 

     first.DoA(); 
     second.DoA(); 
     third.DoA(); 



     Console.ReadLine(); 
    } 

Выход:

C 
C 
C 
I am class C! 
I am class A! 
I am class C! 
The type of this: C - I am class A! 
The type of this: C - I am class A! 
The type of this: C - I am class A! 
+2

Вы, кажется, используете слово «динамический тип», когда имеете в виду «тип времени выполнения». Это затрудняет чтение вашего вопроса, особенно когда ваша программа действительно использует (некоторую) динамическую типизацию. – Servy

+1

Динамический, в C#, обычно используется для совершенно иной цели, чем это. Вам действительно не нужна «динамическая», чтобы делать то, что вы пытаетесь выполнить. –

+0

@ReedCopsey Это было просто для тестирования, чтобы посмотреть, какой результат я получу. –

ответ

6

Могу ли я создать такое поведение или это ограничение языка?

Такое поведение можно создать. Чтобы сделать это, вам нужно сделать ваши методы виртуальными. Это даст вам такое поведение, не используя динамику вообще.

public class A 
{ 
    public virtual void methodA() 
    { 
     Console.WriteLine("I am class A!"); 
    } 

Затем, позже:

public class B : A 
{ 
    public override void methodA() 
    { 
     Console.WriteLine("I am class B!"); 
    } 
} 

В C#, вы должны явно сделать ваши методы виртуальной. В Java методы по умолчанию фактически виртуальны. Это не ограничение языка - это просто разница между двумя языками.

+0

@ Серви, если вы прочтете его ответ, очевидно, что он имеет в виду. Эти парсеры онлайн REDIC –

+0

Это действительно желаемое поведение. Спасибо! –

Смежные вопросы