2016-04-15 7 views
0

私はまだインターフェイスについて学んでいるので、私の質問は基本的なものかもしれません!クラスを実装して特定のレイアウトを使用するよう強制するために、インターフェイスでsetLayout()を使用できますか?

私はread a bit about interfacesでした。私が思いついたユースケースの1つは、クラスを実装して特定のレイアウトを使用するように強制することです。

例:

私はJPanelを拡張するいくつかのクラス(ページ1、ページ2、...)を持っています。それらのすべては、コンストラクタでsetLayout(new MigLayout())を使用してMigLayoutを使用します。 MigLayoutを設定するのを忘れた場合でも、クラスはまだ機能している可能性があります。したがって、常にすべてのクラスに対して同じレイアウトを設定することが望ましいです。

あなたのクラスでこのメソッドを使用することを忘れないように、私の考えは、インターフェイスを作成し、クラスに使用されるいくつかのメソッドを入れることです。特にsetLayout(new MigLayout())メソッドです。

しかし、これは私にエラーを与える:

ForcedLayout testLayout = new ForcedLayout(){ 
{ 
    setLayout(new MigLayout()); 
}}; 

しかし、私は中testLayoutを使用する方法を見つけることができませんでした:

Syntax error on token "setLayout", @ expected before this token

を私はまた、インターフェイスに匿名の内部クラスを使用しようとしましたクラスを実装するので、レイアウトが強制されます。

ので:

  • は、それはインターフェースを介して特定のレイアウトを使用するために実装したクラスを「強制」することは可能ですか?
  • このアプローチを使用することはまったく意味がありますか?すべてのクラスは、したがって、あなたが作成することができJPanelを拡張しているので

答えて

1

(アプローチ=私は一種の特定の方法を使用することを忘れないようにインターフェイスを使用する)あなたのJPanelを拡張し、MigLayoutがすでに設定されている独自のMigLayoutPanel

public abstract class MigLayoutPanel extends JPanel { 

     public MigLayoutPanel() { 
      this(new MigLayout()); 
     } 

     private MigLayoutPanel(LayoutManager layout) { 
      super(layout); 
     } 

     @Override 
     public void setLayout(LayoutManager layout) { 
      if(!(layout instanceof MigLayout)){ 
       throw new UnsupportedOperationException("not allowed to change the layout"); 
      } 
     } 
} 

カスタムクラスが完成しました。

public class MyPanel extends MigLayoutPanel { 
    .... 
} 

インタフェースだけを宣言またはコンクリートサブクラスは、それらのすべてを実装しなければならないこと契約(メソッドのセット)を定義します。 Java 7は、インターフェイス自体にデフォルト機能を追加できるようにするDefault Methodsをサポートしています。

注:これは完全な解決策ではありません。どのサブクラスもそれをオーバーライドすることができます。

+0

にクラスに同じレイアウトを設定することは非常に良い方法を、このクラスを拡張するために、すべてを頼みます!しかし、私の質問は、インターフェイスを使用して実装クラスがこれを行うことができるかどうかです。私はより良いインターフェースを理解したい。 – hamena314

+0

[インタフェースのデフォルトのメソッド](https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html)を使用できますが、フル・プルーフ・ソリューションではないサブクラスではオーバーライドできます – Braj

+0

Ah、インターフェイスで 'setLayout(MigLayout migLayout)'を実行し、他のクラスに実装させることができます。メソッドの欠点はオーバーライドされないように保護されています。私はそれを受け入れることができるように答えとして投稿することができますか?これは実際に私がインターフェイスについて知りたいものです。 – hamena314

0

(インターフェイスではなく)基本クラスを探していて、他のクラスでこのクラスを拡張できるようにしていますか?

public class BaseLayOutClass extends JPanel 
{ 
    public BaseLayOutClass() 
    { 
     // somebasic code if you want 
     setLayout(new MigLayout()); 
    } 
    // Have all other methods defined here. 

} 

、その後、あなたが

public class Panel1 extends BaseLayOutClass 
{ 
} 
+0

答えをありがとう、ありがとう、私はレイアウトを設定する実装クラスを強制的にインターフェイスを使用できるかどうかについて私の質問です。インターフェイスをもっと理解したい – hamena314

+1

インターフェイスを強制してメソッドを書くように依頼しても、そのメソッドを呼び出すのは誰ですか?基本クラスそのもの。インターフェイスでは、メソッドの実装を行うことはできません – Optional

+0

良い点は、実装クラスを強制的に**特定のメソッドを持つことはできますが、クラスを**呼び出し**メソッドに強制することはできません。これは理由です、私は 'setLayout(new MigLayout())'をインターフェースで直接使うことはできませんか? – hamena314

関連する問題