一部のクラスにしか利用できない – プログラミング – Home

一部のクラスにしか利用できない
 
通知
すべてクリア

[解決済] 一部のクラスにしか利用できない


ch
 ch
(@ch)
ゲスト
結合: 17年前
投稿: 5
Topic starter  

Managerクラスがありその機能は一部のクラスにしか利用できないって設計の場合
一部のクラスをfriendする以外に何か方法はありませんか?


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

Managerのメソッドをprotectedにしておけば、
メソッド呼び出しはManagerの導出クラスに限定されます。

# お奨めしません。


返信引用
ch
 ch
(@ch)
ゲスト
結合: 17年前
投稿: 5
Topic starter  

お勧めしない理由を教えてください


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

クラス構造上リーズナブルでない状態になる可能性があるからでは?
本来はクラスの機能としてリーズナブルな形での派生をするべきなのに
protectedの関数を呼び出したいという目的だけで派生するケースが
出てきそうなので。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> お勧めしない理由を教えてください

導出するだけで使えるようになるんじゃ
制限の意味がありません。

素直にfriendするのが上策です。


返信引用
ch
 ch
(@ch)
ゲスト
結合: 17年前
投稿: 5
Topic starter  

ありがとうございました。

実は継承よりfriendの方が妥当な理由が知りたかったのです。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 継承よりfriendの方が妥当な理由
「明らか」じゃありませんか?


返信引用
ch
 ch
(@ch)
ゲスト
結合: 17年前
投稿: 5
Topic starter  

Managerとその他のクラスの作ってる人が違えば
friendでないと、勝手にManagerを継承されて
簡単に使えてしまえますのでfriendの方が妥当な事はわかりました。


返信引用
yoh2
 yoh2
(@yoh2)
ゲスト
結合: 18年前
投稿: 70
 

勝手に継承、も問題ですが、PATIOさんの書いた
> protectedの関数を呼び出したいという目的だけで派生するケース
これが起こると目も当てられませんね。

例えば、クラスAとBとで共通のManagerのインスタンスを使いたいがために、

Manager m; // A, B共通で使うManagerのインスタンス

class A: public Manager {
...
void Managerを使う関数その1() {
m.何か(); // あれ? A自身が持つManagerサブオブジェクトは?
}
...
};

class B: public Manager {
...
void Managerを使う関数その2() {
m.何か(); // だからB自身のManagerサブオブジェクトは?
}
...
};

なんてことをしてしまうと、無駄なサブオブジェクトはできるわ、継承の概念を
根底からぶち壊すやらで、もはや何が何やら。

# 実際にこんなコードを見て戦慄したことがあります。正気なくすかと思った……


返信引用
ch
 ch
(@ch)
ゲスト
結合: 17年前
投稿: 5
Topic starter  

こんなのを考えていました。

class Manager
{
protected:
Manager(){}
void something(){}
void something2(){}
};

class A:public Manager
{
public:
void usedManager(){ something(); }
};

class B:public Manager
{
public:
void usedManager(){ something2(); }
};


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> こんなのを考えていました。

表示されているコードに問題はありません。
something()が何をするかによっては問題があります。

よくある例でCarクラスからTruckクラスが派生しているのがありますよね?
人が車を使いたいからといって、class Driver : public Carにするのは間違いです。

chさんのManagerとAとの関係がCarとTruckの関係だと思いますか?
CarとDriverの関係だと思いますか?
Driver以外の人には運転させたくない、という目的のために、
継承を使うのが誤りなのです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました