言い換えれば、クラスがある場合
class A
{
public:
A() { .. }
virtual void somemethod() { .. }
};
書いてもいいですか
class B : public A
{
public:
B() { .. }
protected:
virtual void somemethod() { .. }
};
または、このアプローチにはいくつかの欠点がありますか?
言い換えれば、クラスがある場合
class A
{
public:
A() { .. }
virtual void somemethod() { .. }
};
書いてもいいですか
class B : public A
{
public:
B() { .. }
protected:
virtual void somemethod() { .. }
};
または、このアプローチにはいくつかの欠点がありますか?
そのアプローチの主な欠点は、いつでもポインター/参照を取得して、公開されている場所A
を呼び出すことができることsomemethod
です。なぜそんなことをしたいのですか?B
が でありA
、A
s がpublic を持っている場合、 s も public を持ってsomemethod
いますB
。
これはポリモーフィズムの目的に反していると言えます。なぜなら、ポリモーフィック型を受け入れる関数を作成すると、派生型も同様に機能するはずだからです。
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.
私見、「常に」成功する「ベストプラクティス」を信じていないため、解決しようとしている特定の問題によって異なります。
このアプローチには欠点はありません。唯一の制限は、オブジェクト/ポインタ/参照B::somemethod()
で呼び出すことができないことです。のポインタまたは参照B
を使用してのみ呼び出すことができるようになりました。A
実際、この制限が意図的に導入されることがあります。このようなシナリオは、の開発者が、基本クラスのハンドルを使用して多形的にのみ呼び出されることを意図しclass B
たメッセージを伝えたい場合です。somemethod()
欠点はありません。
しかし、これを行うことの本当の利点はありません。ケースクラスへのポインタを介して、
引き続きアクセスできます。somemethod()
したがって、技術面での欠点や利点はありません。
それでは、オブジェクトの使用がいかに簡単であるかに移ります。オブジェクトのユーザーを混乱させているので、ここに欠点があります(なぜこのレベルでは保護されているのに、下位レベルでは保護されていないのですか)?したがって、この決定を下した理由と、この手法を使用して達成しようとしていることを文書化することで、自分で作業を作成しています。
あなたが本当に達成しようとしていることは何ですか?