よくc++などで
下記のような作りがありますが、
カプセル化をするためにaをprivateにしているのに
Setaを作ってしまうと値の変更ができてしまいますが、
これは明示的にSetaを呼び出さないと変更できないので許されているのでしょうか?
class B
{
private:
float a;
public:
float Geta(){return a;}
void Seta(float x){ a = x;}
}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
カプセル化をするためにaをprivateにしているのに
Setaを作ってしまうと値の変更ができてしまいますが、
これは明示的にSetaを呼び出さないと変更できないので許されているのでしょうか?
カプセル化を何だと思っての疑問なのかわかりませんが、カプセル化というのは「クラスの内部データ構造をクラス外部に対して隠蔽し、それを変更する操作のみを公開すること」です。
つまり「変更できる操作を公開する」事は定義上何の問題もありません。
これは「データ」と、setter/getterというそれを変更・取得するための操作、というインターフェイスを分離することで、インターフェイスに変更がない限り、クラス内部でどのような変更があろうと、そのクラスを利用する他の箇所への影響をない事を原理的に保障するためのものです。
投稿2021/02/06 02:42
総合スコア8947
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
aの実際の制御権はクラスが保持しているわけで、その意味でOKというところではないでしょうか。
例えば、実はaはMIN以上MAX以下に制限されなければいけない、何ていう事情があったときに、セッタ経由であればセッタにその範囲制限を組み込むことでクラスの責任範囲でそれを保証できるわけです。
aをpublicにしてしまったらそういうわけにはいかず、外部に値の制限をお願いすることになってしまい、仕様の依存関係がでてきてしまいます。
(今回は実際にはそういう制限は'たまたま'なかったわけですが)
もちろん、セッタゲッタがずらーっと並ぶとしたらそのクラスの設計ってどうなの? ということにはなりますね。
投稿2021/02/06 02:52
総合スコア7703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
たとえば、自動車の運転で、スピートを上げ下げするのは、アクセルかブレーキであり
セットスピードじゃないです。
もちろん外部からスピードを勝手に変更されないようにprivateにしますが、
属性を外部からアクセスできないようにすること、それ自体はカプセル化ではないと考えます。
※もちろんカプセル化の一部であり、カプセル化を実現するための手法ではあります
投稿2021/02/06 02:50
総合スコア4826
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
そういうもん、だとしか言いようがないです。
外部からaを変更するためには必ずSetaを経由しなければならない、ということですね
投稿2021/02/06 02:27
編集2021/02/06 02:32総合スコア88038
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。