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

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

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

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

Q&A

解決済

2回答

4436閲覧

C# クラスの継承方法について教えていただけないでしょうか。

sju

総合スコア16

C#

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

0グッド

0クリップ

投稿2018/11/29 02:02

visual studio 2017

C#(プログラミング)の基礎を独学で勉強しているところです。
最近になってclass分けをしたほうが、今後ソース編集等が簡単になるということで
分けたいと思うのですが、検索してみていてもいまいち理解出来ていません。

試しに下記のようなForm1を作成して継承してForm2を作成しました。
Form2のソースにForm1で作成したlavel1の記述を変更しようとしましたが、
「アクセス出来ない保護レベル」ということでエラーになってしまっています。

継承を使うことで、プログラムの動作や外見を共有出来ると理解していましたが、間違っているでしょうか。

例や理解しやすいサイト等を教えていただければ大変助かります。
初歩的な質問だと思いますが、どうぞよろしくお願いいたします。

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace WindowsFormsApp8 12{ 13 public partial class Form1 : Form 14 { 15 public Form1() 16 { 17 InitializeComponent(); 18 } 19 20 private void Form1_Load(object sender, EventArgs e) 21 { 22 23 } 24 } 25}

下記の【label1.Text = "ssss";】の部分でアクセス出来ない保護レベルになっていますと記載されてエラーになっています。

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Text; 7using System.Windows.Forms; 8 9namespace WindowsFormsApp8 10{ 11 public partial class Form2 : WindowsFormsApp8.Form1 12 { 13 public Form2() 14 { 15 InitializeComponent(); 16 } 17 18 public void label1_Click(object sender, EventArgs e) 19 { 20 label1.Text = "ssss"; 21 } 22 } 23} 24

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

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

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

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

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

papinianus

2018/11/29 02:25

質問に直接影響しない提案的コメントです。本当に継承が必要なのかは考えたほうが良いと思います
guest

回答2

0

ベストアンサー

Form1のlabel1をprivateからpublicに変更しましょう。
又はprotected。
private → 他のクラスからアクセスできない
public → どのクラスからもアクセスできる
protected → 継承したクラスからのみアクセスできる

投稿2018/11/29 02:06

編集2018/11/29 02:08
otftrough

総合スコア476

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

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

sju

2018/11/29 02:11

とても早い回答ありがとうございます。 質問に記載していました、アクセス保護レベルのエラーは出なくなりました。 しかし、lavel1をクリックしても表示が指定のものに変わりません。 その理由も分かりますでしょうか。
BeatStar

2018/11/29 02:26

横から失礼します。 sjuさん、まさかForm2で更新したのにForm1に反映されないorzっていうことじゃないですよね? それなら当たり前です。 継承は単に構造を継承するだけです。オブジェクト同士はなんも繋がりはありません。( コンポジションしてメッセージングによって更新することは可能だけど。 ) 初心者にありがちなパターンに思えたので...
sju

2018/11/29 03:01

BeatStarさま、回答ありがとうございます。 まさにその通りの勘違いをしていました。 Formを複製したかったわけではなく、クラス分けだけが本来したかったのですが、継承して分けていくものなのかと思っていました。。。
guest

0

方法 : Modifiers プロパティおよび GenerateMember プロパティを使用する

フォームに貼り付けたコンポーネントはデフォルトでプライベートメンバーになりますので継承先からアクセスできません。
プロパティグリッドを見ると、ラベルのプロパティに Modifiers と GenerateMember という項目があると思います。
GenerateMember はコンポーネントをフィールドとしてアクセスできるかどうかを指定し、Modifiers はスコープを指定します。

GenerateMember は既に trueになっていると思うのでそのままにし、Modifiers を Public にしてください。

投稿2018/11/29 02:19

編集2018/11/29 02:21
Zuishin

総合スコア28660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問