2

言い換えれば、クラスがある場合

class A
{
public:
   A() { .. }
   virtual void somemethod() { .. }
};

書いてもいいですか

class B : public A
{
public:
   B() { .. }
protected:
   virtual void somemethod() { .. }
};

または、このアプローチにはいくつかの欠点がありますか?

4

4 に答える 4

4

そのアプローチの主な欠点は、いつでもポインター/参照を取得して、公開されている場所Aを呼び出すことができることsomemethodです。なぜそんなことをしたいのですか?Bが でありAAs がpublic を持っている場合、 s も public を持ってsomemethodいますB

于 2011-09-28T19:29:52.740 に答える
2

これはポリモーフィズムの目的に反していると言えます。なぜなら、ポリモーフィック型を受け入れる関数を作成すると、派生型も同様に機能するはずだからです。

void fun(A* a){
   a->somemethod();
}
...
A* a = new B();
fun(a); // Shouldn't this work?!
        // According to Liskov Principle, you are doing it wrong!
        // but really who cares, it depends on your justification
        // of a solution to the the problem at hand.

私見、「常に」成功する「ベストプラクティス」を信じていないため、解決しようとしている特定の問題によって異なります。

于 2011-09-28T19:34:41.613 に答える
0

このアプローチには欠点はありません。唯一の制限は、オブジェクト/ポインタ/参照B::somemethod()で呼び出すことができないことです。のポインタまたは参照Bを使用してのみ呼び出すことができるようになりました。A

実際、この制限が意図的に導入されることがあります。このようなシナリオは、の開発者が、基本クラスのハンドルを使用して多形的にのみ呼び出されることを意図しclass Bたメッセージを伝えたい場合です。somemethod()

于 2011-09-28T19:38:00.650 に答える
0

欠点はありません。

しかし、これを行うことの本当の利点はありません。ケースクラスへのポインタを介して、
引き続きアクセスできます。somemethod()

したがって、技術面での欠点や利点はありません。
それでは、オブジェクトの使用がいかに簡単であるかに移ります。オブジェクトのユーザーを混乱させているので、ここに欠点があります(なぜこのレベルでは保護されているのに、下位レベルでは保護されていないのですか)?したがって、この決定を下した理由と、この手法を使用して達成しようとしていることを文書化することで、自分で作業を作成しています。

あなたが本当に達成しようとしていることは何ですか?

于 2011-09-28T19:42:19.297 に答える