Читаем Crystal Programming. Введение на основе проекта в создание эффективных, безопасных и читаемых веб-приложений и приложений CLI полностью

Здесь мы создали трех разных сотрудников, а затем создали массив, содержащий их всех. Этот массив имеет тип Array(Employee), хотя в нем также содержится SalesEmployee. Этот массив можно использовать для вызова методов:

employee_list.each do |employee|

    puts "#{employee.name}'s yearly salary is $#{employee. yearly_salary.format(decimal_places: 2)}."

end

Это приведет к следующему результату:

Elen's yearly salary is $60,000.00.

Susan's yearly salary is $68,000.00.

Eric's yearly salary is $48,000.00.

Как показано в этом примере, Crystal вызовет правильный метод, основанный на реальном типе объекта во время выполнения, даже если он статически типизирован как родительский класс.

Создание иерархии классов полезно не только для повторного использования кода, но и для обеспечения полиморфизма. Вы даже можете ввести в свою программу неполные классы, просто чтобы объединить похожие концепции. Некоторые из них должны быть абстрактными классами, как мы увидим далее.

<p>Абстрактные классы</p>

Иногда мы пишем иерархию классов, и не имеет смысла разрешать создавать объекты на основе некоторых из них, потому что они не представляют конкретных понятий. Сейчас самое время пометить класс как абстрактный. Давайте рассмотрим пример:

abstract class Shape

end

class Circle < Shape

    def initialize(@radius : Float64)

    end

end

class Rectangle < Shape

    def initialize(@width : Float64, @height : Float64)

    end

end

И круги, и прямоугольники - это разновидности фигур, и они могут быть поняты сами по себе. Но форма сама по себе является чем-то абстрактным и была создана для наследования. Когда класс является абстрактным, его создание в виде объекта запрещено:

a = Circle.new(4)

b = Rectangle.new(2, 3)

c = Shape.new # This will fail to compile; it doesn't make sense.

Абстрактный класс не только накладывает ограничения, но и позволяет нам описать характеристики, которые должен реализовывать каждый подкласс. Абстрактные классы могут иметь абстрактные методы, а методы без определений должны быть переопределены:

abstract class Shape

    abstract def area : Number

end

class Circle

    def area : Number

        Math::PI * @radius ** 2

    end

end

class Rectangle

    def area : Number

        @width * @height

    end

end

Определяя метод абстрактной области в родительском классе, мы гарантируем, что все подклассы должны будут определять его, используя одну и ту же сигнатуру (без аргументов, возвращая какое-либо число). Например, если у нас есть список фигур, мы можем быть уверены, что сможем вычислить площадь каждой из них.

Абстрактный класс не ограничивается абстрактными методами - он также может определять обычные методы и переменные экземпляра.

<p>Переменные класса и методы класса</p>

Объекты являются экземплярами определенного класса и хранят значения переменных его экземпляра. Хотя имена и типы переменных одинаковы, каждый экземпляр (каждый объект) может иметь разные значения для них. Если тип переменной экземпляра является объединением нескольких типов, то разные объекты могут хранить в себе значения разных типов. Класс описывает каркас, в то время как объекты являются живыми объектами.

Но классы тоже являются объектами! Разве у них не должны быть переменные экземпляра и методы? Да, конечно.

Когда вы создаете класс, вы можете определить переменные класса и методы класса. Они находятся в самом классе, а не в каком-либо конкретном объекте. Переменные класса обозначаются префиксом @@, точно так же, как переменные экземпляра имеют префикс @. Давайте посмотрим на это на практике:

class Person

    @@next_id = 1

    @id : Int32

    def initialize(@name : String)

        @id = @@next_id

        @@next_id += 1

    end

end

Здесь мы определили переменную класса с именем @@next_id. Она существует сразу для всей программы. У нас также есть переменные экземпляра @name и @id, которые существуют для каждого объекта Person:

first = Person.new("Adam") # This will have @id = 1

second = Person.new("Jess") # And this will have @id = 2

# @@next_id inside Person is now 3.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных