2011-07-03 10 views
0

1) OnCreateは、ClsLastクラスのインスタンス化されたオブジェクトのパブリックメソッドです。 しかし、私はOnCreateメソッドを保護されたとして制限したいと思っていました。オブジェクト指向のインターフェイス、抽象クラス、コンクリートクラスに関する質問

interface InterFace { 
    void OnCreate(); 
} 

class ClsFirst implements InterFace { 
    @Override 
    public void OnCreate() { } 

} 

class ClsLast extends ClsFirst{ } 

class Test { 
    static void main(){ 
     ClsLast objClsAct = new ClsLast(); 
     objClsAct.OnCreate(); 
    } 
} 

2)インタフェース

interface InterFace { 
    protected void OnCreate(); 
} 

で保護されたとして、私は方法をOnCreateの設定した場合、私はこのようなエラーを取得しています:私は、保護設定した場合 Illegal modifier for the interface method OnCreate; only public & abstract are permitted

3)このようにInterFaceを実装するClsFirstクラス内のメソッド:

Cannot reduce the visibility of the inherited method from InterFace

4)私は抽象クラスとしてClsFirstを変更して、実装インタフェース、私は内部のメソッドをOnCreate関数を実装するためにしていない

interface InterFace { 
    void OnCreate(); 
} 

abstract class ClsFirst implements InterFace { 

} 

interface InterFace { 
    void OnCreate(); 
} 

class ClsFirst implements InterFace { 
    @Override 
    protected void OnCreate() { } 

} 

私はこのエラーを取得していますClsFirstクラスだがClsLastなぜ?私はインターフェイスのメソッドは、派生クラスでのみ使用することができます設定することができますどのように

概要

  1. Interface内の保護されたアクセスでメソッドを設定できないのはなぜですか?
  2. なぜInterFaceを実装した後に、アクセサーのタイプをpublicと違うように設定できないのですか?
  3. インタフェースを実装していても、1つのクラスが抽象クラスを派生するま​​で、実装されていないメソッド自体を追加する必要はありません。どうして?

ありがとうございます。

+0

インターフェイスの実装はどのような状況だと思っていますが、派生クラスへのアクセスのみを制限するのは意味があると説明できますか?派生クラスだけがメソッドを見ることができる場合、なぜインターフェイスが必要でしょうか? – dtb

+0

私はインターフェイスを作成し、クラス構造の作成の初期段階からいくつかのルールを入れたいと思っています。しかし、これをしようとしている間、私は他の質問に直面しました。あなたの答えで私と誰のためにもOOPについての良い情報があるかもしれないと思ったのですが、私の最初の欲望は、ルールとインターフェイスと抽象クラスを使って良いクラス構造を作ることです。 – uzay95

+0

OOPの1つのポイントは、開発者がクラスの非公開部分を自由に設計できることです。ルールは、クラス構造のパブリック部分にのみ置くことができます。 – dtb

答えて

2

interfaceは、public contractである。インターフェイスを実装することで、一連のメソッド(および他の言語のプロパティ)を提供することを約束します。

インターフェースは、それから、あなたが単一のクラスにしたいとあなたはできるだけ多くのインターフェイスを実装することができますので、abstractクラスと共通のものを持っていないし、あなたimplementの代わりderive

abstract classは基本クラスで、部分的に機能的なベースのように、異なるクラス間で実装の詳細を共有するために使用され、契約も提供します。しかし、それはより多くの派生クラスのための内部契約です。ほとんどの場合、抽象クラスは、公開された契約を共有するのではなく、派生したすべてのクラスを共通のパターンに強制するために使用されます。

抽象クラスでは、派生クラスにメソッドを実装する(またはvirtualキーワードを使用して適切なデフォルト実装を提供する)よう強制することができ、このメソッド(これはTemplate Patternと呼ばれます)を使用します。

抽象クラスにインターフェイスを実装する場合、抽象クラスをインスタンス化できないため、すべてのインターフェイスメソッドを指定する必要はありません。ただし、すべてのインタフェースメソッドを実装していない場合は、階層内の最初の非抽象クラスが欠落しているメソッドを提供する必要があります。

2

インターフェイスメソッドは常にpublicです。これらのメソッドの範囲を縮小することはできません。抽象クラスではなく保護された抽象メソッドを使用します。

0

実際にあなたの具体的なクラスは、明示的インターフェイスを実装することで、「インターフェイス」のインスタンスにキャストされるまで、この方法を非表示にすることができます:

abstract class ClsFirst : Interface 
{ 
    void Interface.OnCreate() 
    { 
      this.OnCreate(); 
    } 

    protected abstract void OnCreate(); 
} 

ClsFirst last = new ClsLast(); 
last.OnCreate(); // Compiler Error, since OnCreate() is protected 
Interface lastAsInterface = last; 
lastAsInterface.OnCreate(); // Works, and calls the abstract OnCreate() method. 
+0

java: 'インターフェースInterFace {void OnCreate(); } 抽象クラスClsFirstはInterFace { \tを実装しています。protected abstract void OnCreate(); } 'はこのエラーを生成しています:'継承されたメソッドの可視性をInterFaceから減らすことはできません。 'そして 'void InterFace.OnCreate()'メソッドを抽象クラスの中に実装することはできません。 – uzay95

+0

しかしC#では、あなたの応答は何のエラーも出さずに動作しています。 – uzay95

+0

申し訳ありませんが、私はタグ "C#"で投げられました。 Javaは明示的なインタフェースをサポートしているようですが、それらを抽象クラスの内部に実装することは問題です。 –

1
  1. あなたはそれを行うことはできません。インタフェースコントラクトで定義されている部分だけを実装する中間クラスがある場合は、メソッドを仮想または抽象として設定できます。

  2. あなたはまたそれを行うことはできませんし、理由は簡単です、インターフェイスは契約、実装が要求する操作のセットを定義します。抽象クラスで明示的にインターフェイスを実装したり、少なくとも内部的に「内部」にすることができます。

  3. インターフェイスを実装することを約束したため、できません。

  4. クラスを抽象としてマークすると間接的に指摘している別のことは、インスタンス化できないということです。したがって、(私は継承のチェーンを意味する)のインスタンスを作成することができますファーストクラスにインターフェイスを実装する要件を渡します。

ad1。 (c#example1)

+0

あなたの4つの答えをありがとう。今私は理解し、それらを1つずつテストしようとしています。私は中産階級の中で保護されたメソッドを設定できませんでした。 1番目の答えに例を挙げてください。 – uzay95

0

1)保護されたinterfaceを最初に実装したいのはなぜですか?それはどんな価値も追加しません。

protected abstract void OnCreate(); 

2)インタフェースはpublic契約を定義する:あなたはすでに、すべての派生クラスは、与えられた契約を遵守することを確認する方法を持っています。 public私はそれがインターフェイスitselftと同じアクセシビリティを持っていることを意味します。そのため、interfaceのメンバーを定義する際にアクセシビリティ修飾語は使用できません。

3)仮想メンバーまたはインターフェイスメンバーのアクセシビリティを低下させることはできません。これは、インターフェイスの契約を破るためです。あなたの例では、OnCreate()はアクセスできないので、ClsFirstIOnCreateインターフェイスを実装していないので、((IOnCreate)ClsFirst).OnCreate()は不可能です。

関連する問題