teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

解決済

4回答

627閲覧

C# 継承のprotectedが分からない。

turnberry0712

総合スコア9

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

0グッド

0クリップ

投稿2025/06/18 00:27

0

0

実現したいこと

  • 継承について理解する
  • 継承について書かれている記事への理解(あとで貼ります)

前提

ここに質問の内容を詳しく書いてください。
(例)
C#で数字を当てるゲームを作ってます。
継承を実装中していましたがprotectedの理解できなくなりました。

発生している問題・エラーメッセージ

C#

1まだありません

該当のソースコード

namespace HitAndBlow { public class VariableStorageClass { public byte[,] question; public List<byte[,]> answer; public byte[,] solution; public VariableStorageClass() { this.question = new byte[3,3]; this.answer = new List<byte[,]>(); this.public byte[,] solution; } } }
namespace HitAndBlow { public class HistoryItemClass : ProcessClass { public HistoryItemClass() { InitializationFunction(); } } }
namespace HitAndBlow { public partial class MainForm : Form { ProcessClass gameMatch; public MainForm() { gameMatch = new ProcessClass(); InitializeComponent(); } } }

試したこと

※protectedについて調べましたがわかりませんでした。protectedの『使える 状況・使い方』を知りたいです。
アクセシビリティ レベル MSLearn
未確認飛行 C コンストラクター
未確認飛行 C 継承

補足情報(FW/ツールのバージョンなど)

OS:Windows11
VisualStudio2022
ターゲットフレームワーク:.NET 9.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2025/06/18 01:57

> 該当のソースコード これが提示されている意味ってなんですか? protected とか見当たらないし?
turnberry0712

2025/06/18 02:36

コメントありがとうございます。protectedについて存じておらず、調べましたがよく理解できませんでした。 参考サイト等があれば教えていただけますでしょうか? 現在、VariableStorageClass を親としており、子をHistoryItemClass。 子にあたるHistoryItemClassをメインでgameMatchとして宣言しております。 つまり、親にあたる変数、関数をprotected修飾子してしまっても良いか皆さんに見ていただいていると思っていただけたら幸いです。 何卒宜しくお願い致します。 また違和感があれば教えてください。宜しくお願い致します。
dodox86

2025/06/18 02:58

@質問者 turnberryさん プロフィール欄を見ると12歳(C#に挑戦、すごいですね)、過去のご質問の内容からすると初心者の方だと思いますが、「初心者」マーク(自動車で付ける若葉マーク)を付けると良いと思います。 > protectedについて存じておらず、調べましたがよく理解できませんでした。 こういうことは反対に、自分でその必要性を感じないとなかなか理解できないです。疑問に思って質問することはとても良いと思うのですが、継承とか考え方の疑問は、たくさんプログラミングをして必要になったときにやっとピンときたり分ることも多いので、最初から高度なことをしなくてもいいんじゃないかなぁ、とも思いますよ。 とのことですが、継承の必要性がピンとくるには
fana

2025/06/18 03:00

> してしまっても良いか これは結局,「何をどうしたいのか次第」になるので…… 回答として書いてみましたが.
turnberry0712

2025/06/18 04:19

dodox86さん ありがとうございます。継承難しいです。 ベースA・BをCに継承させたい。ですができないなどつらいです。 fanaさん いつもお世話になっております。 何をどうしたいか次第 となっておりますが、回答もいただいているので、こういう路線ではないかと意図を読んでいただけるとこちらとしても大変助かります。 回答で、こちらは違いこうしたかったです。というと上にある質問回答と問題への質問回答(BA?)への回答など時間短縮になり助かります。 今回の場合なのですが、今回は継承は親と子というで 二人の親を一人の子に継承させることはできず、 一人の親に一人の子で継承させていきます。 親のVariableStorageClass の中にある変数にprotectedつけたいのですが、 これprotectedつけてもつけなくても変わりあるのかわからず、どのようになるのか想像できません。 これでイメージをつけていただけたでしょうか。文章が長くなり大変申し訳ございません。 読んでいただきありがとうございます。
guest

回答4

0

ベストアンサー

極論ですが、protectedがなくても直接困ることはありません。publicで全部アクセスできるから動かないプログラムというのは、(メタプログラミングでprotectedの設定自体に依存するような特殊なものを書かない限り)存在しません。

では、なぜそのような機能が存在するのかなのですが、他人の書いたライブラリを使う、あるいは自分自身でも過去に書いてディテールを忘れたものを再利用する、等の場合に、存在するメソッドを想定しない形で呼んでしまって不整合な状態に陥る、というのを避けるために行われるものです。


「とりあえず動くコードを書く」という段階ではprotectedで悩んでも、ほとんど意味がありません。コードも関わる人も増えた状況でだけ意味を持ってくる機能なので、とりあえずprotectedは後回しにしてコードを書き進めることをおすすめします。

投稿2025/06/18 04:59

maisumakun

総合スコア146653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2025/06/18 05:11

私も同意見でしたので、グッドを押させていただきました。自分用のプログラムを書いている初心者の方でこの辺り、オブジェクト指向関連のトピックで止まってしまう方をさんざん見かけているので、今はこだわらずに動くこと優先で先に進めた方が精神的にも良いと思います。気にとめておいて、ちゃんとやっていけばいずれ分かるでしょう。
turnberry0712

2025/06/18 05:17

回答ありがとうございます。 ベストアンサーはこちらmaisumakunさんのを選ばせていただきました。 回答も非常に参考になりました。
fana

2025/06/18 05:21

同意感. protected とか書く機会がかなり稀な気もします(個人の感想です)し,本当にそれが必要な状況に遭遇してから考えはじめるので良い気がします.
guest

0

protectedの『使える 状況・使い方』

この話が無かった感なので,識者から「いや,そうじゃねぇよ」と突っ込まれる前提で私見を書いてみます.

使い道としては virtual, abstract なメソッドとかですかね.

  • virtual : 内部実装であって(:だからpublicではない),デフォルトの動作は定義してあるが,派生先でここの処理を変えたければいい感じに変えてどうぞ.
  • abstract : 内部実装であって,「○○処理が必要な時にはこのメソッドを呼ぶぜ!」というところまでは実装してあるんだけど,この「〇〇処理」の具体的な内容は不明なので,派生元で実装を補ってくださいよろしく.(Template Method パターン)

みたいな.

投稿2025/06/19 04:59

fana

総合スコア12206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

protected よりも前に,
publicprivate については大丈夫なんでしょうか.たとえば

C#

1public class X 2{ 3 public void F1(){ /*ここでは処理内容はどうでもいいので省略*/ } 4 private void F2(){ /*ここでは処理内容はどうでもいいので省略*/ } 5}

とかなんとか書くとき,ものすごくざっくり言えば
F2() というのは, X の内側(: Xの別のメソッドとかの中)でしか使わないぜ!」
っていう話ですよね.だから private にしている,と.

これだと
X x = new X(); x.F2(); みたくして X の外側から F2() を使うことができないわけですが,それだけでなく,
class Y : X として X を継承した Y の内側(: Y の別のメソッドとかの中)でも F2() は使えません.

C#

1public class Y : X 2{ 3 public Method(){ F2(); } //←できない. 4}

それで良いなら private のままでOKです.
それだと困る(: F2() というのは,外側からは使えないようにしたいけども, X を継承した Y の内側では使いたい)という場合に,それを可能にするのが protected です.

投稿2025/06/18 02:55

編集2025/06/18 02:58
fana

総合スコア12206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2025/06/18 03:02

……といった感じなので, 「自身を継承したやつには使わせたいけども,その他のやつには使わせたくない」とかいう物が目の前に生じていないのであれば protected にする必要は無いと思う.
turnberry0712

2025/06/18 04:47

ProcessClass gameMatch;と宣言してあとあとnewするのと、 ProcessClass gameMatch = new ProcessClass();とするのは、protectedで違いがあるのでしょうか。 どちらも親クラスのVariableStorageClass に  protected class VariableStorageClass とすると、gameMatchにどのように影響するのでしょうか。 そこがわかりませんでした!
guest

0

protectedの仕様に限定して回答します

protectedとは、継承関係にあるクラス同士に限定してアクセス可能なメンバを定義するアクセス修飾子の一種です

class Base{ protected int num=0; } class Sub1:Base{ internal static void Test(Sub1 sub1,Sub2 sub2){ System.Console.WriteLine(sub1.num); //アクセス可能 //System.Console.WriteLine(sub2.num); アクセス不可 } } class Sub2:Base{ internal static void Test(Sub1 sub1,Sub2 sub2){ System.Console.WriteLine(sub1.num); //アクセス不可 //System.Console.WriteLine(sub2.num); アクセス可能 } }

アクセスできるメンバは、直接的な継承関係にあるクラスのインスタンスに限られます
同一のクラスから派生していても、子クラス自体が相互に関連性のないクラスである場合は親クラスのメンバを呼べません

protectedprivateと並びカプセル化の文脈を構成します
protectedを利用することで、親子間で完結するようなオブジェクトの内部処理を実装できます

投稿2025/06/18 02:13

Manabu

総合スコア120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turnberry0712

2025/06/18 02:33

回答ありがとうございます。 私の提示したソースコードなのですが、 VariableStorageClassをHistoryItemClass : ProcessClassと親子関係にしつつ ProcessClass gameMatch;とメインから宣言しているのでgameMatchの中にProcessClassの中身とProcessClassの関数変数が使えるという認識でよろしいでしょうか。 よろしくお願いいたします。
Manabu

2025/06/18 03:28

ProcessClass gamatch; gameMatch=new ProcessClaas(); とあるので、おっしゃる通りProcessClassのメンバは呼び出せます ただし、ここでは子クラスのインスタンスが代入されている訳ではないので、このままではMainメソッドで子クラスのメンバは呼び出せません また、先の回答の通りprotectedでカプセル化されたメンバも同様です 外部に公開したいメンバは、publicで修飾することを忘れないでおきましょう
turnberry0712

2025/06/18 04:42

回答ありがとうございます。 「このままではMainメソッドで子クラスのメンバは呼び出せません」の部分について存じておらず、調べてないのですがいまいち理解できませんでした。 他の方の回答にもあるとおり、 protectedの親の中にあるprivateは継承しても絶対に触れない。 protectedの親の中にあるprotected変数を継承したら子供は触れられるけど、 ProcessClass gameMatch;と変数にすると触れなくなる。 という感じでいいのでしょうか。 宜しくお願い致します。
Manabu

2025/06/18 04:59

イメージとしてはおおむねそれで構いません > ProcessClass gameMatch;と変数にすると触れなくなる この節が少し怪しいですが「ProcessClass及びその子クラスの外」で定義される変数を指しての理解であれば問題ありません
turnberry0712

2025/06/19 11:04

>「ProcessClass及びその子クラスの外」 ProcessClassを継承したクラス か ProcessClass gameMatch;のような変数になるのでしょうか。 ご返信いただければ幸いです
TYY

2025/06/24 06:02

通りすがりに失礼します。 おそらく『> ProcessClass gameMatch;と変数にすると触れなくなる』というのは、ProcessClass をインスタンス化するということを意味していると思われます。 ProcessClass クラスにprotected なメンバーがあれば、それはインスタンス化して利用する外側から見るとprivate と同じことという理解で大丈夫です。 protected は継承して子クラスを作る場合に、親子関係の中でだけ意識すれば良いです。 親クラス・小クラスいずれにしても、外からそれらのクラスを利用する側からはprivate と考えればOKです。 ProcessClass を継承して、HistoryItemClass : ProcessClass を作った場合 HistoryItemClass hcInstance = new HistoryItemClass(); // 子クラスのインスタンス化 ProcessClass pcInstance = new ProcessClass(); // 親クラスのインスタンス化 いずれにしても、protected なメンバーにはアクセスできません。 hcInstance.protectedMember へのアクセス → エラー pcInstance.protectedMember へのアクセス → エラー public class ProcessClass { protected protectedMember; public publicParentMember; } public class HistoryItemClass : ProcessClass { public publicChildMember; } スレッド外から失礼しました。参考になれば幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問