Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
def initialize(name, age, sex)
@name, @age, @sex = name, age, sex
end
# ...
end
А класс
Student
class 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)
Посмотрим внимательно, что здесь сделано. Что за
super
initialize
Student
initialize
Не всегда необходимо использовать слово
super
Если говорить об истинном смысле наследования, то оно, безусловно, описывает отношение «является». Студент является человеком, как и следовало ожидать. Сделаем еще три замечания:
• Каждый атрибут (и метод) родительского класса отражается в его потомках. Если в классе
Person
height
Student
say_hello
• Потомок может иметь дополнительные атрибуты и методы, мы это только что видели. Поэтому создание подкласса часто еще называют расширением суперкласса.
• Потомок может переопределять любые атрибуты и методы своего родителя.
Последнее замечание подводит нас к вопросу о том, как разрешается вызов метода. Откуда я знаю, вызывается ли метод конкретного класса или его суперкласса?
Краткий ответ таков: не знаю и не интересуюсь. Если вызывается некий метод от имени объекта класса
Student
Object
А что если мы хотим вызвать метод суперкласса, но не из соответствующего метода подкласса? Можно сначала создать в подклассе синоним:
class Student # Повторное открытие класса.
# Предполагается, что в классе Person есть метод say_hello...
alias :say_hi :say_hello
def say_hello
puts "Привет."
end
def formal_greeting
# Поприветствовать так, как принято в суперклассе.
say_hi
end
end
У наследования есть разные тонкости, которых мы здесь касаться не будем. Общий принцип мы изложили, но не пропустите следующий раздел.
11.1.6. Опрос класса объекта
Часто возникает вопрос: «Что это за объект? Как он соотносится с данным классом?» Есть много способов получить тот или иной ответ.
Во-первых, метод экземпляра
class
type
s = "Hello"
n = 237
sc = s.class # String
nc = n.class # Fixnum
He думайте, будто методы
class
type
Class
Class
s2 = "some string"
var = s2.class # String
my_str = var.new("Hi...") # Новая строка.
Можно сравнить такую переменную с константным именем класса и выяснить, равны ли они; можно даже использовать переменную в роли суперкласса и определить на ее основе подкласс! Запутались? Просто помните, что в Ruby
Class
Object
Иногда нужно сравнить объект с классом, чтобы понять, принадлежит ли данный объект указанному классу. Для этого служит метод
instance_of?
puts (5.instance_of? Fixnum) # true
puts ("XYZZY".instance_of? Fixnum) # false
puts ("PLUGH".instance_of? String) # true
А если нужно принять во внимание еще и отношение наследования? К вашим услугам метод
kind_of?
instance_of?
is_a?
n = 9876543210
flag1 = n.instance_of? Bignum # true
flag2 = n.kind_of? Bignum # true
flag3 = n.is_a? Bignum # true