Очень нубский вопрос о наследовании ruby, объект ruby внутри FXRuby
Сначала извините за мой плохой английский... я сомневаюсь.. я читаю FXRuby для прагматичного программиста.. и я видел этот код
require 'fox16'
include Fox
class HelloWindow < FXMainWindow
def initialize(app)
super(app, "Hello, World!" , :width => 200, :height => 100)
end
def create
super
show(PLACEMENT_SCREEN)
end
end
app = FXApp.new
HelloWindow.new(app)
app.create
app.run
Это очень простой пример... на самом деле это он первый пример... но я такой нуб, чем не понимаю
приложение является объектом FXAPP.. теперь я создаю объект HelloWindow и передаю свой объект FXApp с именем "приложение"
Все идет нормально
но сейчас... в книге напиши app.create я вызываю метод "create" внутри класса FXApp... или нет?..
почему, когда я вызываю app.create..ruby, вызываем метод create внутри HelloWindow?..app - это совершенно другой объект, чем класс HelloWindow, и я мог бы вызывать метод anscestor (например, когда я использую super), но не наоборот...
почему они не называют это как-то так
helloobject=HelloWindow.new(app)
helloobject.create
таким образом я вызываю метод create внутри класса HelloWindows.. и он происходит от FXMainWindows
Я надеюсь, что вы можете понять (извините за мой плохой английский) и можете мне помочь
Спасибо большое
1 ответ
Я ничего не знаю о FXRuby, но отвечаю на ваши вопросы о Ruby.
Когда Ruby выполняет app.create
, это будет называть create
Метод внутри класса FXApp, потому что app
тип FXApp (при условии, что нет create
метод, определенный для синглтон-класса приложения).
Когда вы звоните app.create
есть, вероятно, какой-то код в классе FXApp для вызовов create
на всех окнах в приложении, так вот как ваше окно create
функция вызывается. Если вы действительно хотите узнать, как работает ваше окно create
функция вызывается, попробуйте добавить raise "hello"
к нему и посмотреть, если вы получите обратный след исключения.
Я действительно не знаю ответа на ваш последний вопрос, потому что он связан с дизайном библиотеки FXRuby. Но концептуально это похоже на вызов app.create
а также window.create
это очень разные вещи. Если вы хотите запустить приложение, вы должны сначала создать его. Простого создания одного окна недостаточно.