2016-01-10 5 views
0

выходной код будеткласс конструкт для джинна

1 
2 
2 

печатать только один раз. Я понятия не имею, как написать это в джинне.

ниже Вал код:

public static void main() { 
    var a = new One(); 
    var b = new One(); 
} 

class One : Object { 
    class construct { 
     stdout.puts("1\n"); 
    } 
    public One() { 
     stdout.puts("2\n"); 
    } 
} 

Что такое эквивалентный код класса построить метод джинна?

Если Genie's init? (СЕЙЧАС), это отличается от конструкции класса vala?

Начальный разряд Genie

ниже не работает!

init 
    var a = new One 
    var b = new One 

class One 
    construct() 
     stdout.puts("2\n") 
    init 
     stdout.puts("1\n") 

конструкция блока требует GLib.object

конструкция блока => INIT блок

но класс Валы построить dosen't.

так Вал будет работа, но Genie dosen't,

код Вала:

class One { 
    class construct { 
     stdout.puts("1\n"); 
    } 
    public One() { 
     stdout.puts("2\n"); 
    } 
} 

Почему эта функция полезна? На самом деле я никогда не использовал класс раньше. , но я думаю, что это полезно, очень полезно.

пример: запустите некоторые статические поля (или поля классов: этот вопрос).

Я не знаю почему? Почему Vala реализует эту функцию? Это должно быть полезно, если Vala реализует его.

ответ

2

Fom, что я могу сказать из документации, я думал, что это было init. Хотя я не уверен, почему вы хотели бы использовать его. Это может быть полезно для некоторой ленивой загрузки статических данных, используемых во всех экземплярах класса, но я никогда не делал этого сам.

В терминологии, ориентированной на объектно-ориентированный язык, класс «создается», когда он создается как объект. Процесс создания экземпляра можно настроить с помощью «конструктора». В Vala и Genie также можно настроить процесс, когда объект больше не нужен с «деструктором».

Если метод не действует на данные в объекте, он называется методом static. По определению конструктор не действует на данные в объекте, а возвращает новый объект. Поэтому конструкторы всегда статичны, а static construct - неправильное имя. В Вале есть class construct, и если вы измените свой код, чтобы использовать его, получите тот же результат. См. Vala different type of constructors для тщательной обработки этого вопроса в Вала.Часть о class construct находится в конце.

Мое понимание было init был причислен к Vala's class construct. Я думаю, что ваш вопрос раскрыл проблему в Genie. Насколько я понимаю, этот код будет ответить на ваш вопрос:

[indent = 4] 
init 
    var a = new One() 
    var b = new One() 
    var c = new One.alternative_constructor() 

class One:Object 
    init 
     print "Class 'One' is registered with GType" 

    construct() 
     print "Object of type 'One' created" 

    construct alternative_constructor() 
     print """Obect of type 'One' created with named constructor 
'alternative_constructor', but the design of your 
class is probably too complex if it has multiple 
constructors.""" 

    def One() 
     print "This is not a constructor" 

    final 
     print "Object of type 'One' destroyed" 

Это, однако, выходы:

Class 'One' is registered with GType 
Object of type 'One' created 
Class 'One' is registered with GType 
Object of type 'One' created 
Class 'One' is registered with GType 
Obect of type 'One' created with named constructor 
'alternative_constructor', but the design of your 
class is probably too complex if it has multiple 
constructors. 
Object of type 'One' destroyed 
Object of type 'One' destroyed 
Object of type 'One' destroyed 

В то время как регистрация с GType происходит только один раз, так что init код кладется в неправильном месте и получение вызова с каждым экземпляром не с регистрацией типа. Так что в настоящее время я не думаю, что в Genie есть эквивалент Vala's class construct.

Изменение поведения init может быть одним из решений, но я, возможно, неправильно понял его первоначальную цель, и, вероятно, сейчас существует много кода, который полагается на его текущее поведение. Другое решение - написать патч для анализатора Genie, который реализует это. Вам нужно будет сделать хороший пример, почему эта функциональность полезна.

+0

Вы правы. Я прочитал его из документа валы. ** класс конструкция ** мой вопрос. Я не знаю, почему я набираю его ** static **. Я уточню свой вопрос. благодаря! – Zee

+0

Привет @AlThomas! ** «Вам нужно будет сделать хороший аргумент, почему эта функциональность полезна». ** Это смутило меня! Vala и Genie - ** ONE **, но имеют различный синтаксис. Почему? Вала может это сделать? но Genie dosen't? – Zee

+0

Vala и Genie используют один и тот же компилятор Vala, поэтому да, эта функциональность может быть добавлена ​​в Genie. Genie - бесплатный проект с открытым исходным кодом, поэтому вы можете загрузить исходный код и добавить функциональность в парсер Genie. Это, конечно, требует времени и навыков. Я не нашел использования для 'class construct' в Genie, поэтому я не думаю, что сам буду писать. Если вам нужно инициализировать статические поля, это можно сделать без необходимости в 'class construct', но это другой вопрос. StackOverflow использует формат вопросов и ответов, и я думаю, что на ваш исходный вопрос был дан ответ. – AlThomas