2014-02-02 2 views
0

Я искал что-то очень легкое для объяснения полиморфизма, и я нашел пример. Но я не вижу, где на самом деле это реализовано в коде и как это делается? Можете ли вы, ребята, помочь мне?Динамический полиморфизм объяснен

Код:

//a class for dynamic polymorphism 
public abstract class Shape 
{ 
    public abstract int Area(); 
} 

class Rectangle : Shape 
{ 
    private int widht = 0; 
    private int lenght = 0; 

    public Rectangle(int a, int b) 
    { 
     widht = a; 
     lenght = b; 
    } 
    public override int Area() 
    { 
     Console.WriteLine("Area ="); 
     return lenght * widht; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Rectangle r = new Rectangle(10, 9); 
     double area = r.Area(); 
     Console.WriteLine(area); 
    } 
} 

ответ

2

Ну, реализуются здесь:

public override int Area() 
{ 
    Console.WriteLine("Area ="); 
    return lenght * widht; 
} 

Ключевого слово override говорит, что этот метод предназначен для полиморфных (здесь он работает вместе с abstract ключевым словом в Shape). Более очевидный способ продемонстрировать это будет, однако:

Rectangle r = new Rectangle(10, 9); 

Shape anUnknownShape = r; //could be also a circle, ellipse, etc. 

// here we "forget" what's the actual shape we're dealing with 

double area = anUnknownShape.Area(); // Area is abstract - a polymorphic call 

Console.WriteLine(area); 

В строке, помеченной второй комментарий вызов является полиморфным - имеющей ссылку типа Shape вы не знаете что Area будет называться именно - это может быть реализация, написанная для Rectangle или для другой, от Circle или всего, что подклассы Shape. Конкретная реализация будет выбрана во время выполнения в зависимости от фактического типа.

+1

Это означает, что функция переопределения также относится к полиморфизму другими словами? –

+0

Точно. «Переопределение метода» будет противоположно «Перегрузка метода» (статический полиморфизм). Метод Overriding - это новое определение существующего метода в его дочернем классе. Все объекты, созданные во время выполнения в куче. Фактическое связывание выполняется во время выполнения. (поздняя привязка) Более пояснительный сайт: http://www.erpgreat.com/java/static-and-dynamic-polymorphism.htm. – user1767754

+0

@AbidAli Да, эти термины строго связаны. Обратите внимание на ссылки, которые я дал под ключевыми словами 'override' и' abstract'. – BartoszKP

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