2014-10-31 4 views
2

В качестве experiemnt я расширив класс Gtk.HeaderBar в Vala, как это, для того, чтобы иметь кнопку вместо названия/Labels субтитров:Переопределение методов в Vala

using Gtk; 

public class WebBrowserHeaderBar : HeaderBar { 

    private Button title_widget; 

    public WebBrowserHeaderBar(){ 
     this.show_close_button = true; 

     title_widget = new Button.with_label("title"); 

     this.set_custom_title(title_widget); 
    } 

    public void set_title(string title){ 
     title_widget.label = title; 
    } 

} 

, а затем я м, используя его как это:

public class MainWindow: Window { 

    private WebBrowserHeaderBar header; 

    public MainWindow() { 
     //this.title = MyWeb.APP_TITLE; 

     this.window_position = WindowPosition.CENTER; 
     this.destroy.connect (Gtk.main_quit); 
     set_default_size (300, 200); 

     header = new WebBrowserHeaderBar(); 
     header.set_title (MyWeb.APP_TITLE); 
     this.set_titlebar(header); 
    } 

} 

это работает, но я получаю следующее предупреждение при компиляции:

WebBrowserHeaderBar.vala:15.2-15.22: warning: WebBrowserHeaderBar.set_title hides inherited method `Gtk.HeaderBar.set_title'. Use the `new' keyword if hiding was intentional 
    public void set_title(string title){ 
    ^^^^^^^^^^^^^^^^^^^^^ 
Compilation succeeded - 1 warning(s) 

Если я изменить способ, как этот public override void set_title(string title){, он не будет компилироваться:

WebBrowserHeaderBar.vala:15.2-15.31: error: WebBrowserHeaderBar.set_title: no suitable method found to override 
    public override void set_title(string title){ 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Compilation failed: 1 error(s), 0 warning(s) 

Почему я получаю это? Как я могу избавиться от предупреждения и/или успешно переопределить метод set_title?

ответ

4

Вы можете только переопределять методы, которые являются abstract или virtual. Другие методы не могут быть переопределены, но вы можете скрыть их, используя ключевое слово new:

public new void set_title (string title) { 
    title_widget.label = title; 
} 

Если ссылка типа WebBrowserHeaderBar, или один из его детей, этот метод будет вызван. Если ссылка имеет тип HeaderBar или один из ее суперклассов, то будет использоваться оригинал set_title.

Это нечто вроде драконов.

+0

Это очень ясно, спасибо! – lviggiani

Смежные вопросы