2016-09-20 2 views
2

발라 tutorialvala는 기본 생성자가없는 GObject를 어떻게 정의 할 수 있습니까?

튜토리얼이 클래스는 입심에서 상속 여부를 완전히 독립적 것을 보여준다 클래스 중 하나 G 객체 스타일에, 또는 Java/C 번호 등 비슷한 스타일로 생성자로 기록 될 수 있음을 보여줍니다. GObject 또는 아닙니다. (편집 : 자습서 전환 Glib.ObjectObject 사이에 혼란스러워했다. 발라있는 거기에 암시 적 using Glib, 그래서 두 동일합니다).

Glib.GObject 하위 클래스가 기본 생성자 (Java/C# 스타일 사용)없이 정의 된 경우 암시 적 기본 생성자를 GObject 용으로 정의해야하며 모든 필드가 이진수 0으로 채워질 수 있습니다. (G 객체 초기화에 따라)?

Initialize a GObject with parameters which are not GObject properties?

답변

1

Vala는 자동으로 C 코드로 생성자를 생성합니다. 이것은 * 새로운 명명 패턴을 따릅니다. 그래서 가장 간단한 예는 : 당신이 valac --ccode example.vala 이것을 컴파일하고 결과 C 코드를 보면

void main() { 
    new ExampleWithoutExplicitConstructor(); 
} 

class ExampleWithoutExplicitConstructor { 
} 

당신은 _vala_main 통화 example_without_explicit_constructor_new() 표시되고이 후 example_without_explicit_constructor_construct()를 호출합니다. example_without_explicit_constructor_construct()은 해당 유형에 대해 g_object_new()을 호출합니다. 형식을 만드는 g_object_new의 일부로 어떤 변수도 초기화 할 수있는 example_without_explicit_constructor_instance_init()을 호출합니다.당신은 C에서 알 수

void main() { 
    new ExampleWithoutExplicitConstructor(); 
} 

class ExampleWithoutExplicitConstructor:Object { 
    private string example_field = "default"; 

    public string an_object_property { get; 
     set; 
     default = "this object properties default string"; 
     } 
} 

: 여기

때문에 전체 GObject 클래스이며, 기본 값 필드와 기본 값으로 속성이, Object에서 상속 더 복잡한 예입니다 코드는 _new, _construct, g_object_new, _instance_init 패턴이 동일합니다. Vala가 수행 한 작업은 _instance_init으로 설정되어 필드 및 속성의 기본값을 초기화합니다.

기본값이없는 공용 필드는 null입니다. 인스턴스 데이터가 들어있는 struct의 정의에 나타납니다. 비공개 필드는 비슷하지만 인스턴스의 경우 개인 struct에 보관됩니다. 예제를 가지고 노는 것으로 이것을 볼 수 있습니다.

0

보기의이 valac -C와 함께 알아 보자.

예 번호 : 생성 무엇 valac의

MySuper* my_super_construct (GType object_type, gint i) { 
    MySuper * self = NULL; 
    gint _tmp0_ = 0; 
    self = (MySuper*) g_object_new (object_type, NULL); 
    _tmp0_ = i; 
    self->priv->i = _tmp0_; 
    self->priv->j = 1; 
    return self; 
} 


MySuper* my_super_new (gint i) { 
    return my_super_construct (TYPE_MY_SUPER, i); 
} 


MyDerived* my_derived_construct (GType object_type) { 
    MyDerived * self = NULL; 
    self = (MyDerived*) my_super_construct (object_type, 10); 
    return self; 
} 


MyDerived* my_derived_new (void) { 
    return my_derived_construct (TYPE_MY_DERIVED); 
} 

일부 ovservations :

  • MySuper 및

    class MySuper : Object 
    { 
        private int i; 
        private int j; 
    
        public MySuper (int i) 
        { 
         this.i = i; 
         j = 1; 
        } 
    } 
    
    class MyDerived : MySuper 
    { 
        public MyDerived() 
        { 
         base (10); 
        } 
    } 
    

    제 (의 중요한 부분)은 C 코드는 다음과 같다 생성 MyDerived는 모두 _construct_new 기능을 갖습니다.

  • my_super_constructg_object_new 만 호출하십시오.
  • my_derived_construct 통화 만 my_super_construct (차례로 호출하는 g_object_new.

그래서 모든 것이 좋게 발라 컴파일러와 C 번호로 연결됩니다/자바 스타일의 생성자가 G 객체 스타일의 구조로 변환됩니다.에 관해서는

멤버의 초기화 : 생성 된 생성 함수는 Vala 코드에 초기화를 제공하지 않으면 아무것도 초기화하지 않습니다.

이 모든 작업은 Vala와 함께 진행됩니다.코드 생성의 세부 사항을 원할 경우 항상 -C ...

관련 문제