1

Objective-C では、プロトコルと実装を同じヘッダー ファイルで定義できます。例えば:

@class GamePickerViewController;

@protocol GamePickerViewControllerDelegate <NSObject>
  - (void)gamePickerViewController:
    (GamePickerViewController *)controller 
    didSelectGame:(NSString *)game;
@end

@interface GamePickerViewController : UITableViewController

@property (nonatomic, weak) id <GamePickerViewControllerDelegate> delegate;
@property (nonatomic, strong) NSString *game;

@end

このように .h ファイルを含めると、ファイル内で定義されたプロトコルにアクセスできます。私は Java で同様の構造を探しています。あまりにも多くのファイル (インターフェイス ファイル + クラス ファイル) を作成したくない場合に便利です。そうすれば、次のように宣言できます。

public class MyImplementation implements AnotherClass.MyInterface{
      AnotherClass otherClass;
}

インターフェイス内のネストされたクラスが進むべき道だと思います。私は正しいですか?それともJavaに似たものはありませんか?

4

6 に答える 6

12

クラスをネストし、ネストされたクラスをpublic staticにすることができます。これにより、クラスを同じソースファイルに含めることができます(これは珍しいことですが、パッケージにまとめて別のソースファイルを使用するのが一般的です)。

たとえば、これは許可されています

public class AnotherClass {

    public static interface MyInterface{
        // Interface code
    }

    public static class MyClass{
        //class code
    }
}

そして別のファイルで

public class MyImplementation implements AnotherClass.MyInterface{

}

別のオプションは

public interface MyInterface{
    public static class MyClass implements MyInterface{
    }
}

次に、MyInterface.MyClassを使用してクラスにアクセスします(java.awt.geom.Pointこの種の構造の例については、を参照してください)。

于 2012-08-07T17:32:14.333 に答える
2

そのようなクラスとインターフェースをネストして、公開することができます! ただし、拡張したいクラスに拡張されたクラスがネストされているクラス/インターフェースを実装/拡張することはできません

したがって、これは機能しません:

class A extends A.B {
    public class B {

    }
}

そこにクラス B public があっても問題ありませんが、最上位クラスは内部クラスを拡張できません。

于 2012-08-07T17:26:46.763 に答える
1

ネストされたクラスを使用すると、同様のことを実現できます。たとえば、実装をインターフェイスとともにパッケージ化します。

public interface MyInterface
{
    public class Implementation implements MyInterface
    {

    }
}

MyInterfaceこれで、具体的な実装の両方が得られましたMyInterface.Implementation

于 2012-08-07T17:24:11.480 に答える
0

あなたができることは、インターフェイスを定義してから、デフォルトの実装を匿名の内部クラス、クラスの静的変数として持つことです。

interface AProtocol {
    String foo();

    static final AProtocol DEFAULT_IMPLEMENTATION = new AProtocol(){
            @Override
            public String foo(){
                return "bar!";
            }
        };
}

ということですか?

于 2012-08-07T17:23:34.897 に答える
0

Java API は、この種のことをクラスで頻繁に行います。たとえば、JFormattedTextFiled.AbstractFormatter。宣言にstatic修飾子が含まれていることに注意してください。インターフェイスでもこれを行うことができなかった理由がわかりません。

于 2012-08-07T17:29:03.600 に答える