2013-06-19 3 views
0

Предполагая, что у меня есть два класса следующим образом:Почему нет дочернего класса, ограниченного свойствами родителя?

class Fruit 
{ 
    public string color { get; set; } 
} 
class Orange : Fruit 
{ 
    public double diameter { get; set; } 
} 

А затем создать оранжевый объект внутри плодового переменной

Fruit fruit = new Orange() { color = "Orange", diameter = 10.0 }; 

// This line prints 10 even though the Fruit class doesn't contain a 
// diameter property 
Console.WriteLine(((Orange) fruit).diameter); 

Как пришел весь оранжевый, включая имущество диаметра, может втиснуться в плодах переменная? Почему переменная фруктов не ограничивается определением класса Fruit?

В чем разница, если вместо этого я помещу новый оранжевый в переменную Orange, как в этом примере?

Orange fruit = new Orange() { color = "Orange", diameter = 10.0 }; 

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

+2

Это именно то, что касается кастинга ... В противном случае это было бы бесполезно. –

ответ

5

Fruit является обобщением, а Orange - специализация. Специализированные объекты могут импровизировать на существующие унаследованные атрибуты или могут иметь добавленные свойства, специфичные для него.

Как весь оранжевый цвет, включая свойство диаметра, может втиснуться в переменную плода?

fruit - только ссылочная переменная, но относится к новому объекту Orange, который находится, вероятно, в куче. Объект Orange определен достаточно большим, чтобы удерживать свойство diameter. Тип ссылки суперкласса может относиться к объектам подкласса. Таким образом, вы можете реализовать Полиморфизм. Если вы сделаете что-то вроде этого fruit.color, то во время выполнения вы можете получить доступ к свойству color любого подкласса, который расширяет Fruit и к объекту, на который ссылается fruit.

Почему переменная плода не ограничивается определением класса Fruit?

Когда вы сделаете это:

Fruit fruit = new Orange() { color = "Orange", diameter = 10.0 }; 

Вы даете себе шанс реализовать полиморфизм в вашем коде. Если вы объявляете метод, передающий Fruit в качестве аргумента, вы можете использовать ссылочную переменную типа Fruit для доступа к свойствам или вызвать методы на нем, фактически не ограничивая ваш метод определенным типом Fruit. В будущем, если вы хотите изменить конкретный плод от Orange до Apple, где Apple расширяет Fruit, вы можете повторно использовать этот метод и убедиться, что методы или свойства, определенные в Fruit, будут работать для конкретного типа фруктов.

Что бы разница, если я поставил новый оранжевый внутри переменной Orange вместо

Как я уже говорил ранее, если вы используете конкретную ссылку типа, то вы не можете воспользоваться полиморфизм.

+0

Так что фрукты становятся как интерфейс, а не ограничивающей переменной, если я правильно понял вас? – Ohlin

+0

@Ohlin Это может быть класс с определенной реализацией, который является общим для другого базового класса, тогда как базовый класс может переопределять эти методы или добавлять определенные методы. – NINCOMPOOP

+0

Хорошо, спасибо большое ... – Ohlin

0

Это в основном потому, что вы создаете Orange, а Fruit - это обобщение апельсина.Это всего лишь обертка реального оранжевого объекта. Важно то, что вы создаете апельсин и назначаете его как фрукты, но фрукты - апельсин. Если вы делаете

Fruit _fruit = new Fruit() 

что было бы иначе. Вы создаете Orange, и Orange наследует от Fruit, и именно поэтому вы можете так писать.

1

Это называется runtime-polymorphism. Orange расширяет фрукты и добавляет новые свойства, такие как диаметр. Когда вы создаете объект Orange и помещаете его в Fruit, он сохраняет свои свойства, только эти фрукты не могут их решить. Затем вам нужно будет сделать OrangeFruit, чтобы получить диаметр.

От Wikipedia

В информатике, полиморфизм это язык программирования, функция, которая позволяет значения различных типов данных, которые должны быть обработаны с помощью единого интерфейса. Понятие параметрического полиморфизма применяется как к типам данных, так и к функциям. Функция, которая может оцениваться или применяться к значениям разных типов, известна как полиморфная функция. Тип данных, который может показаться обобщенным типом (например, список с элементами произвольного типа), обозначается как полиморфный тип данных, такой как обобщенный тип, из которого сделаны такие специализации.

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