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, который реализует это. Вам нужно будет сделать хороший пример, почему эта функциональность полезна.
Вы правы. Я прочитал его из документа валы. ** класс конструкция ** мой вопрос. Я не знаю, почему я набираю его ** static **. Я уточню свой вопрос. благодаря! – Zee
Привет @AlThomas! ** «Вам нужно будет сделать хороший аргумент, почему эта функциональность полезна». ** Это смутило меня! Vala и Genie - ** ONE **, но имеют различный синтаксис. Почему? Вала может это сделать? но Genie dosen't? – Zee
Vala и Genie используют один и тот же компилятор Vala, поэтому да, эта функциональность может быть добавлена в Genie. Genie - бесплатный проект с открытым исходным кодом, поэтому вы можете загрузить исходный код и добавить функциональность в парсер Genie. Это, конечно, требует времени и навыков. Я не нашел использования для 'class construct' в Genie, поэтому я не думаю, что сам буду писать. Если вам нужно инициализировать статические поля, это можно сделать без необходимости в 'class construct', но это другой вопрос. StackOverflow использует формат вопросов и ответов, и я думаю, что на ваш исходный вопрос был дан ответ. – AlThomas