2012-03-11 6 views
1

Bjarne Stroustrupは、一度、プライベートまたはパブリックメンバー変数だけでほとんどのタスクに対処でき、 。私は他の場所でも同様の議論を聞いています。ここで`protected`を使用しない場合、サブクラスが基本クラスで定義された変数を効果的に使用する方法

class BaseClass 
{ 
    ... 
private: 
    int m_iAge; 
    double m_dSalary; 
    string m_strName; 
    bool m_bGender; 
} 

class SubClass : public BaseClass 
{ 
    ... 
} 

は、上記のクラスの設計を考えると、一例であり、サブクラス​​はBaseClassで定義された変数を使用することができますか?

Question1>なぜ我々はprivateではなくprotected変数を持つことを好むでしょうか? BaseClassが実装の詳細を隠して、それ以上の改善を容易にする理由はありますか?

Question2>変数はBaseClassで定義された​​アクセスをさせるためには、我々が(設定/取得)、パブリックアクセスを定義する必要があることに私には思えます。しかし、ゲッター/セッターは悪いです!したがって、2番目の選択肢は保護されたアクセス(get/set)を定義することです。どんな良いアイデア?

あなたは

+2

getterとsetterが_evil_であるかどうかはわかりませんが、JavaやC++ではなく、多くの言語で取得できるプロパティ構文を使用することは非常にうれしいです。 –

+1

Holub、Allen。なぜゲッターとセッターの方法が悪いのか? JavaWorld.com、2003年9月http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html – q0987

+0

Javaでは、ゲッター/セッターは実際には悪ですが、C++では、 'operator =(T &&)'と '(T &&)'コンストラクタはそれをはるかにエレガントにします。これは、 'memcpy'の出入り時に特定のエンディアンを必要とするPOD型を扱う場合に特に便利です。 – moshbear

答えて

0

私はこの主張の根拠は、多くの状況では、サブクラス化は、多くの場合、既存の(継承されたフィールド)の動作を変更しないということだと思い感謝のではなく、1フィールドを追加し、操作する新しいメソッドが追加されます新しいフィールド。

保護されていない継承されたメンバーを操作する方法を探している場合は、ベースクラスで派生クラスをフレンドにすることができます。あなたはそれを前もって知っていなければなりません。

+2

友人は友人に「友人」を使用させません –

+0

@JasonS:ナンセンス!確かに、これは「友人」(少なくとも私にとっては)を使うのに良い時期のようには聞こえませんが、そういったことはほとんどありません。 1つの明白な例のために、ほとんどのストリームエクストラクタ(std :: istream&operator >>(std :: istream&、whatever&);)は 'whatever'クラスの友人になるはずです –

+0

私はファンではありません私はその答えの最初の部分に目を向ける:*ほとんどの場合、継承は、あなたがスーパークラスの動作を変更する必要はありません。何らかの理由でサブクラスが継承された構造体を操作する必要がある場合は、基本クラスメンバを 'protected'にするか、または基本クラスのインタフェースを柔軟にしてメソッドで効果を発揮できるようにしてください必ずしも 'get'と' set'であるとは限りません。 –

2

Bjarneのポイントは、一般的に派生クラスが頻繁に行うとメンテナンスの問題につながるはずではないということです。そしていいえ、それはget/set(アクセサ/ミューテータ)機能を使用するために変更することは改善ではありません。

0

プライベートな保護されたメンバーを使用する唯一の主な理由は、実際に子の実装で必須でない場合です。子クラスは親クラスのメンバーへの直接アクセスを必要としない場合があるので、それは、私たちはメンバーを保護してきた理由です。私はStroustrupが最初に親メンバーにアクセスする必要性がほとんどなく、子クラスが親の機能を変更するのではなく、親の機能を構築するという設計を指していると思います。

ただし、getter/setterは悪です!

なぜそうですか?ゲッターとセッターは私の経験からOOPの重要な部分です。その変数に直接アクセスするのではなく、クラスとのインタフェースを作るのがよい理由があります。

1

自分自身に尋ねます - なぜ派生クラスはm_bGenderの値を変更するのでしょうか?またはm_iAge?基本クラスはすでにこれらの値を正しく処理していませんか?

を参照してください。一般的には、には、の基本クラスの内部への直接アクセスがありません。だから私たちはそれらを非公開にして、クラスのパブリックインターフェイスを使用します。

非常にまれなケースがいくつかあります。派生クラスに特別なインターフェイスが必要な場合は、1つまたは2つの保護された関数が存在することもあります。しかしそれは珍しいことです。派生クラスの動作が異なる場合は、仮想関数を使用することがよくあります。

関連する問題