2016-10-17 2 views
1

私はダーツにはまだまだ新しく、それがもたらすすべてのニュアンスを学んでいます。私の現在の仕事で私が実際に抱いていることの一つは、親クラスから静的メソッドを継承(またはプロキシ)することです。"継承された"静的メソッドを正しくプロキシする方法はありますか?

void main() { 
    EnglishCasual.greet(); 
} 

class English { 
    static greet() { 
    actGreeting(); 
    sayGreeting(); 
    } 

    static sayGreeting() { 
    print('hello'); 
    } 

    static actGreeting() { 
    print('<tips hat>'); 
    } 
} 

class EnglishCasual extends English { 
    static sayGreeting() { 
    print("m'lady"); 
    } 

    static actGreeting() { 
    print('<tips fedora>'); 
    } 
} 

以上、ダートのドキュメントによると、静的メソッドは継承されていないので、動作が期待されるエラーNoSuchMethodError: method not found: 'greet'与える(私には奇妙に思えるれますが、[OK]をクリックします。上の移動を...)

だから、私は...親クラスに

DartPad Example

を簡単なプロキシを試してみましたしかし、それは別のエラーを生成:Invalid context for 'super' invocationまたは'super' is only available in instance methods。 Ok ...明示的に親クラスを名前で呼んでみましょう。

DartPad Example

しかし、予想通り、それはちょうどEnglish.greet()に、他のコールとして扱われ、我々は正式な挨拶代わりのカジュアルな1を取得しています。意味をなさない

それで、私は反射になった。それはwasn、noSuchMethodがstaticとして定義されていなかったので、私は、期待している必要がありますエラーThe method 'greet' is not defined for the class 'EnglishCasual'をもたらし

DartPad Example

:私は有望に思えたし、テストにそれを置くように、ここでスニペットを見つけました静的メソッド呼び出しが呼び出されています。だから、最後にもう一度...

DartPad Example

そして、私たちは別のエラーThe name 'noSuchMethod' is already defined in 'core/object.dart'を取得します。

この時点で、私はアイデアがありません。この(一見シンプルな)エクササイズを行う方法がないようで、私はあなたが正しい方向に私を向けることを本当に望んでいます。

これを行う正しい方法は何ですか?

+0

静的メソッドは継承されず、AFAIKをプロキシすることはできません。 –

+0

静的メソッドを使用しないでください –

答えて

1

静的メソッドは継承されません。つまり、インスタンスメソッドだけが継承されます。 使用すると、1つの呼び出し操作で2つの異なる関数を呼び出すことができる唯一の方法があれば次のとおりです。

  • それは関数値を呼び出します(。税込ゲッター、セッターとオペレーター)インスタンスメソッドを呼び出す、または
  • ています。ある

callA(o) => o.foo(42); // Instance method. 
callB(f) => f(42); // Function value. 

すべて他の状況、呼び出す関数を静的に決定されるので、あなたは常に正確に同じ関数を呼び出します。 greet関数は、インスタンスメソッド自体でないか、選択に役立つパラメータを必要としない限り、呼び出される方法によって異なる関数を呼び出すことはできません。

つまり、静的関数を使って賢いことをしようとしないでください。 のバージョンをsayGreetingとし、actGreetingに置き換えようとしています(English)。インスタンスメンバーの場合にのみ機能します。

+0

私が探しているのは、少なくとも「PHPでそれが呼び出されたものです」という、「遅い静的バインディング」と呼ばれると思います。基本的には、すべてのクラス階層と継承が最初に決定され、オーバーライドが解決/適用された後に、「静的」が適用されます。ダーツは早期に静的なものに見えます。 – KOGI

+0

レイトスタティックバインディングは、スタティックが継承されている場合にのみ意味があり、Dartでは継承されません。静的メンバーはトップレベルメンバーと変わらず、クラスを名前空間として使用するだけです。とにかくすべて静的に解決されるので、同じ機能を2つの異なるクラスから利用できるようにすることが利点とはみなされなかった場合は、常に正しいものに直接アクセスできます。 – lrn

0

静的メソッドはダートで継承されていない、上書きすることができないなど

standardを開き、10.7静的メソッドを検索します。

+0

はい、これも私の元の質問にも述べました。私は目標を達成するための別の方法を探しています。 – KOGI

0

dartpadに示すように、「静的」なキーワードを削除するだけで継承が有効になり、上書きが開始されます。

オブジェクト指向プログラミング(OOP)の概念を振り返ってみることをお勧めします。幸いなことに、Java OOP basicsを使用することができます.Dartはこの場合クラスベースのオブジェクト指向言語と似ています。あなたはまた、ダーツの達人Seth Laddと、より一般的にはWikipediaが言っているかどうか確認することができます。

関連する問題