2016-08-24 5 views
0

IはコールスーパースーパークラスonResume()とonCreae()

public class A extends Fragment{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //other stuff 
    } 
    @Override 
    public void onResume() 
    { 
     super.onResume(); 
     someFunctionOnlyUsefulInFragmentA() 
    } 
} 

そして第二のクラスのようにAとB Bは、フラグメントAを拡張する二つの断片を有する:

public class B extends A{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //other stuff 
    } 
    @Override 
    public void onResume() 
    { 
     super.onResume(); 
     //Problem! I don't want to call function "someFunctionOnlyUsefulInFragmentA()" 
    } 
} 

問題はフラグメントAのonResume()onCreate()メソッドですべてのコードを実行したくないということですが、フラグメントBでのみ使用されるカスタムコードもあります。しかし、アンドロイドはsuper.onCreate()super.onResume()を呼び出します。

フラグメントAのコードを呼び出さずに、フラグメントBのonCreate()またはonResume()メソッドでカスタムコードを実行するにはどうすればよいですか?

コードデザイン全体を変更する必要がありますか?もしそうなら、どうですか?

+0

次に、フラグメントAのonResumeにコードを入れないでください。 –

+0

'super.onCreate()'と 'super.onResume()'を呼び出す必要はありません。 「Androidはあなたを強制します」とはどういう意味ですか? –

+0

さて、フラグメントAのonResume()メソッドで実行されるコードが必要です!スーパーコールを含まないと、アプリがクラッシュします。 – Merlin1896

答えて

3

あなたの問題は、Androidの断片ではなく継承に関連しています。クラスAからClass Bを派生させる代わりに、ABの両方が(そしていくつかの機能を共有する)クラスBaseFragmentを導入し、AフラグメントにのみsomeFunctionOnlyUsefulInFragmentA()を入れてください。あなたが上記をしようとしたことは、明らかな違反のLiskov Substitution Principleです。

+0

井戸+1リスコフ代理原則 –

0

あなたができることのいくつかのカップルがあります:それは、クラスBのonResume()内部someFunctionOnlyUsefulInFragmentA()の効果を元に戻すために、いくつかのものを行うFragment

  • を延長させる、クラスBがクラスAを拡張しないでください

    1. は、クラスAのonResume()someFunctionOnlyUsefulInFragmentA()を置くか、それはいくつかのケースでそれのfuctionを呼び出す防ぐために、前の状態を入れないでください
  • +4

    オプション2は本当にダム(違反なし)になります –

    +0

    あなたはそれが何であるかわからない、多分それはあなたがそれを簡単に元に戻すことができる何かを本当に役に立たない。 –

    +2

    それdoesnそれは何をしているのか、それはダムのコンセプトです –

    関連する問題