0

C++ では、オーバーライドされたメソッドの可視性を変更できます。この機能は非常に便利な場合があります。たとえば、次のようになります。

クラスにいくつかのデバッグメソッドを持たせたいと考えていますが、それらをパブリッククラスインターフェイスとして表示したくないとします。次のようなものがあります。

class IDebuggable {
public:
 virtual void debug(std::string s) = 0;
};

class MyProductionClass: public IDebuggable

public:
 void myClassMethod() {}

private:
 virtual void debug(std::string) {
  // do some debug here
 }

};

そのために、クラス MyProductionClass のオブジェクトを使用する場合、アクセスできるのは MyProductionClass::myClassMethod() (プロダクション インターフェイス) だけです。

ただし、デバッグ機能を使用したい場合は、次のようにすることができます。

MyProductionClass* obj = new MyProductionClass();
IDebuggable* iface = obj;

iface->debug("Hello World");

私の経験では、この「機能」が非常に便利であることがわかりました。Java では、継承されたメソッドの可視性を変更することは禁止されているため、これは不可能です。上記のアーティファクトを達成する別の方法はありますか?

どうもありがとう

4

5 に答える 5

2

継承されたメソッドの可視性を下げることはできません。これは正しいです。ただし、必要な数のインターフェイスを作成し、これらのインターフェイスを実装するクラスを作成できます。次に、クライアントが特定のインターフェイスで動作する場合、他のパブリック メソッドにも「アクセスできません」。

ここに例があります。

public interface Foo {
    public void foo();
} 

public interface Bar {
    public void bar();
} 

public class MyClass implements Foo, Bar {
    public void foo() {}
    public void bar() {}
}

このクラスの使用方法は次のとおりです。

Foo f = new MyClass();

あなたはfoo()ここに電話できますが、 に電話することはできませんbsar()。ただし、メソッドにキャストFooBarてから使用することはできbar()ます。

于 2013-05-17T15:43:39.553 に答える
1

Java では、メソッドの可視性を高めることはできますが、サブクラス化するときにそれを減らすことはできません。これは、親クラス (インターフェイス) を介してオブジェクトにアクセスでき、親クラスで定義されたすべてのメソッドを呼び出し元が使用できる必要があるためです。

したがって、次のことが可能です。

class A {
    protected void foo() {}
}

class B extends A {
    @Override
    public void foo() {}
}
于 2013-05-17T15:44:16.793 に答える
0

次のような機能ディスカバリーを実装します。

class A {

    public final T <T> lookup(Class<T> klazz) {
        return map.get(klazz);
    }

    public A() {
        map.put(IDebugable.class, new IDebuggable() { ... };
    }
}

A a = ...;
a.lookup(IDebuggable.class).debug();
于 2013-05-17T15:53:33.513 に答える
0

これは (神のために) Java では不可能です。さらに、開発/運用用にさまざまな構成のロギング フレームワークを使用することで、必要なものをより適切に実現できます。

于 2013-05-17T15:40:07.773 に答える