Описание классовых отношений в рубине - PullRequest
3 голосов
/ 09 февраля 2010

Я никогда не делал прямого рубинового кодирования - работал только с фреймворком Rails.

Я не уверен, как описать отношения между классами, кроме отношений наследования.

Например, школьный объект может иметь много ученических объектов. Я хотел бы иметь возможность совершать звонки, такие как «myschool.student [2] .first_name» и «mystudent.school.address»

Возможно, я путаю ООП с элементами реляционной базы данных, так что извините, если я далеко.

Ответы [ 2 ]

9 голосов
/ 09 февраля 2010

Я не на 100% уверен, что вопрос здесь ...

Для первого примера, myschool.students[2].first_name, вашему классу School необходим метод доступа к полю students, который должен быть массивом (или чем-то еще, поддерживающим подписки), например,

class School
  attr_reader :students

  def initialize()
    @students = []
  end
end

Вышеуказанное позволяет myschool.students[2] что-то вернуть. Предполагая, что students содержит экземпляры класса Student, этот класс может выглядеть примерно так:

class Student
  attr_reader :first_name, :last_name

  def initialize(first, last)
    @first_name = first
    @last_name = last
  end
end

Теперь ваш пример, myschool.students[2].first_name, должен работать.

Для второго примера, mystudent.school.address, вам необходимо иметь поле school в классе Student и поле address в классе School.

Хитрость в том, что экземпляры School и Student указывают друг на друга, поэтому вам нужно установить эти ссылки в какой-то момент. Это был бы простой способ:

class School
  def add_student(student)
    @students << student
    student.school = self
  end
end

class Student
  attr_accessor :school
end

Вам все еще нужно добавить поле address и, возможно, некоторые другие вещи, которые я пропустил, но это должно быть достаточно легко сделать.

1 голос
/ 09 февраля 2010

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

Когда вы добавляете участников в класс (скажем, добавляете классы учеников в школу), вам необходимо добавить функции доступа , чтобы обеспечить доступ к этим членам из внешнего мира.

Вот несколько полезных ресурсов, если вы хотите узнать больше (можно найти в googling: ruby ​​accessors ):

http://juixe.com/techknow/index.php/2007/01/22/ruby-class-tutorial/

http://www.rubyist.net/~slagell/ruby/accessors.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...