Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
def initialize(name, age, sex) @name, @age, @sex = name, age, sex end # ...endА класс
Studentclass Student < Person attr_accessor :idnum, :hours def initialize(name, age, sex, idnum, hours) super(name, age, sex) @idnum = idnum @hours = hours end # ...end# Создать два объекта.a = Person.new("Dave Bowman", 37, "m")b = Student.new("Franklin Poole", 36, "m", "000-13-5031", 24)Посмотрим внимательно, что здесь сделано. Что за
superinitializeStudentinitializeНе всегда необходимо использовать слово
superЕсли говорить об истинном смысле наследования, то оно, безусловно, описывает отношение «является». Студент является человеком, как и следовало ожидать. Сделаем еще три замечания:
• Каждый атрибут (и метод) родительского класса отражается в его потомках. Если в классе
PersonheightStudentsay_hello• Потомок может иметь дополнительные атрибуты и методы, мы это только что видели. Поэтому создание подкласса часто еще называют расширением суперкласса.
• Потомок может переопределять любые атрибуты и методы своего родителя.
Последнее замечание подводит нас к вопросу о том, как разрешается вызов метода. Откуда я знаю, вызывается ли метод конкретного класса или его суперкласса?
Краткий ответ таков: не знаю и не интересуюсь. Если вызывается некий метод от имени объекта класса
StudentObjectА что если мы хотим вызвать метод суперкласса, но не из соответствующего метода подкласса? Можно сначала создать в подклассе синоним:
class Student # Повторное открытие класса. # Предполагается, что в классе Person есть метод say_hello... alias :say_hi :say_hello def say_hello puts "Привет." end def formal_greeting # Поприветствовать так, как принято в суперклассе. say_hi endendУ наследования есть разные тонкости, которых мы здесь касаться не будем. Общий принцип мы изложили, но не пропустите следующий раздел.
11.1.6. Опрос класса объекта
Часто возникает вопрос: «Что это за объект? Как он соотносится с данным классом?» Есть много способов получить тот или иной ответ.
Во-первых, метод экземпляра
classtypes = "Hello"n = 237sc = s.class # Stringnc = n.class # FixnumHe думайте, будто методы
classtypeClassClasss2 = "some string"var = s2.class # Stringmy_str = var.new("Hi...") # Новая строка.Можно сравнить такую переменную с константным именем класса и выяснить, равны ли они; можно даже использовать переменную в роли суперкласса и определить на ее основе подкласс! Запутались? Просто помните, что в Ruby
ClassObjectИногда нужно сравнить объект с классом, чтобы понять, принадлежит ли данный объект указанному классу. Для этого служит метод
instance_of?puts (5.instance_of? Fixnum) # trueputs ("XYZZY".instance_of? Fixnum) # falseputs ("PLUGH".instance_of? String) # trueА если нужно принять во внимание еще и отношение наследования? К вашим услугам метод
kind_of?instance_of?is_a?n = 9876543210flag1 = n.instance_of? Bignum # trueflag2 = n.kind_of? Bignum # trueflag3 = n.is_a? Bignum # true
