2009-08-14 11 views
4

コンパイル時にサブクラスがパブリックメソッドをベースクラスで定義されたもの以外に公開しないようにする方法はありますか?例えばJava:サブクラスがベースクラスと異なるインタフェースを提供しないようにする

abstract public class AClass { 

    abstract public void anAllowedMethod(); 

} 

public class BClass extends Aclass { 

    public void anAllowedMethod() { 

    } 

    public void anAdditionalNonAllowedMethod() { 

    } 

    private void thisMethodIsAllowedBecauseItsNotPublic() { 

    } 

} 

はおそらく、私はサブクラスを宣言するAClassはで使用できるいくつかのキーワードが唯一AClassは(。すなわち、「anAllowedMethod()」)で定義されたメソッドを実装することができますがありますか?

+0

私はあなたがこれをしたい理由が不思議です。 – MatrixFrog

+0

これらのサブクラスが正しく使用されていることを確認します。私が取り組んでいるプロジェクトでは、サブクラスに不要なメソッドを追加する開発者もいます(既存のインターフェイスではそれを実現できます)。そして、それがわからないと正しくオブジェクトを使用することができなくなりますタイプ。 "クライアント"が基本クラスのインタフェースを知る必要があることが分かっている場合は、単純化されます。 – Joel

+2

あなたができることの1つは、APIを使用する人々がBClass型の変数を宣言しないようにすることです。 'List myList = new ArrayList ()'が 'ArrayList myList = new ArrayList ()'より優れていると考えています。だから、あなたはインスタンス化されたBクラスですが、変数の型はAClassなので、 'anAdditionalNonAllowedMethod()'を使って決して終了することはありません。 – MatrixFrog

答えて

1

ゲームのこの段階ではおそらく遅すぎますが、実際に実装されている別のタイプのコンストラクタでデリゲートを受け取る関連メソッドで最終クラスを作成し、最終クラスの代理人を呼び出します。そうすれば、デリゲートに何を追加しても、呼び出し可能にならないでしょう。

3

クラスを定義し、それが別のクラスを拡張/実装すると言うと、それはそれが拡張/実装するクラスのコントラクトに従わなければなりません。前記クラスの振る舞いをさらに含むことに制限はない。私が働いているプロジェクトで

、一部の開発者は必要ありませんサブクラス

に余分なメソッドを追加している私が見るように、これは効果的にあなたデザインがバラバラに起こっていることを意味し開発者が(オブジェクトに新しいパブリックビヘイビアを追加することによって)何をしているのかによるものです。

残念ながら、デザインを管理していないと、実装段階(コーディング)に入ると悪いことが起こります。あなたが特定のインターフェイスをブロックしようとしている場合は、最終的なメソッドを宣言する可能性があり、審査のプロセス(自動化/手動)一般的なケースで

0

ない...

しかし...

をご検討くださいあなたの抽象基底クラスで、インタフェースからのメソッドの名前を取得します。そうすれば、誰もサブクラスがインターフェイスを実装するのを妨げることはありませんが、メソッド呼び出しで何もしないようにするでしょう。

私は...あなたは物事を許可しないように、実行時にリフレクションを使用することができることを仮定

そして、あなたは絶対にAOPコンテナでこれを行うことができます。私は、OPに関する追加のコメントを見ただけで、あなたは何をしようとしているのか分かりました。私はこれをソース管理レベルで管理する必要があるものとして扱います。問題のランタイムチェックを行うテストモード(実装ユニットテストとして扱う)、または(CIシステムを使用している場合)チェックイン時にこの種のものをテストしてください。

0

最終とお考えですか?

私が知っているのは、あなたが求めるものではありませんが、このような機能はその言語にはありません。それとも、私が知っている言語であれ、私はたくさん知っています。

これは、あなたがしたいことをやり遂げるための別の方法、つまり根本的な必要性を見つけることにつながります。

しかし、私はこれを行う賢明な理由を想像することができないので、私は困惑しています。

なぜサブクラスがメソッドを追加しないようにしたいのですか?あなたが恐れていることは何でしょうか?

+0

彼はstlilがサブクラスに独自のanOllowedMethodを定義したいので、彼はfinalを使いたいとは思わない。 –

0

あなたがしようとしていることが望ましくないことは、スレッド上の他の人には同意します。しかし、私は、宣言されたメソッドがあなたが期待しているものであることを確かめるためにリフレクションを使うことができると信じています。

Method[] methods = this.getClass().getMethods(); 
for (Method method : methods) 
{ 
    if (method.getName() ...) // check to make sure method is expected 
    { 
     .... // if method not expected throw an exception 
    } 
} 
+0

私はこれをすることを示唆していないでしょう...誰かがそれを実装するのに愚かかもしれないという恐怖のために! –

+0

ええ、あなたは正しいかもしれませんが、彼が求めていることをするでしょう。 :-) –

2

あなたはそれが(もちろん、抽象的にはできません)サブクラス化することはできませんので、クラスの決勝を行いますが、合成/委任を使用するように設計し、その代わりにサブクラスを経由して実装を変更することで、あなたが変えることができますクラスのインスタンスの構成で使用する戦略オブジェクトによって異なります。

1

Javaはこれをサポートしていません。ただし、クラスのクライアントが定義したインタフェースのみを使用するようにするには、Javaインタフェースを宣言してからファクトリを使用して、そのインタフェースを実装するオブジェクトを作成します。したがって、クライアントはインタフェースからメソッドを呼び出すことしかできませんでした。もちろん、誰かが決定した場合、(明示的なキャストを行うなどして)これを回避する方法を見つけることができますが、意図的にデザインを壊している場合は、さらに大きな問題があります。

+0

私は個人的にこれが(ほとんど)正解だと思います。 Javaでは、とにかくインターフェイスにコーディングする必要があります。しかし、すべてのファクトリを書くのではなく、依存性注入(Spring、EJB3、Guiceなど)を使用して実装クラスを作成することです。そして、正直言って、私はDIは非常に、非常に扱いやすい見つける。 – hohonuuli

+0

同意します。とにかく、多くの工場があると、DIフレームワークを使用することは次の論理的なステップです。 –

関連する問題