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

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

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

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

Q&A

解決済

3回答

3167閲覧

C#で特定のクラス以外は参照のみできるようにしたい

yrema

総合スコア286

C#

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

1グッド

2クリップ

投稿2019/10/18 04:47

クラスAとクラスBがあり、パラメータとして使うクラスPがあります。

AからBにCを渡したいのですが、B内でPのフィールドやプロパティで書き換えられたくありません。
つまりCを変更できるのはAクラスのみ内で行いたい、ということは可能なのでしょうか?
以下のソースの「// ここを禁止したい」ところでビルドエラーになるようにしたいです。

c#

1 public class ClassA 2 { 3 public ClassP P { get; set; } 4 public void Init() 5 { 6 P = new ClassP() 7 { 8 Name = "ClassAで生成" 9 }; 10 ClassB classB = new ClassB(); 11 classB.P = P; 12 } 13 public void Func() 14 { 15 P.Name = "ClassAで書き換え"; // ここは許可 16 } 17 } 18 19 public class ClassB 20 { 21 public ClassP P { get; set; } 22 public void Func() 23 { 24 P.Name = "ClassBで書き換え"; // ここを禁止したい 25 } 26 } 27 public class ClassP 28 { 29 public string Name { get; set; } 30 }
xyzpda👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

クラスPのメソッドの中で、クラスBが使ってもよいものだけを取り出したインタフェースIPを作る

c#

1 public interface IP{ 2 string Name{get;} 3 } 4 class A{ 5 class P : IP { 6 public string Name{get;set;} 7 } 8 public void call(){ 9 P p = new P(); 10 p.Name = "aaaaa"; 11 B b = new B(); 12 b.call(p); 13 } 14 } 15 class B{ 16 public void call(IP p){ 17 Console.WriteLine(p.Name); // getはできるが 18 // p.Name = "bbbbbb"; // setは失敗する 19 } 20 }

投稿2019/10/18 05:59

asm

総合スコア15147

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

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

yrema

2019/10/18 06:37

ありがとうございます。これで実現できそうです。
guest

0

方法1

ClassAをClassPから継承させ、

C#

1protected string Neme { get; set; }

とする。

方法2

ClassBを別アセンブリに記述(VisualStudioなどならばプロジェクト(ソリューションとは異なります)を分ける。コードエディタならコードを分ける。)して

C#

1internal string Neme { get; set; }

とする。

以上の方法があります。

ClassBは、他者が作ったコード、或いはライブラリを想定しているのでしょうか?
そのような場合はプロジェクトを分ける方法が適切だと思います。

しかし、そうでない場合オブジェクト指向にクラスごとに権限を分けるという機能は本来必要ないものですので少し回りくどい方法しかありません。

似たような質問
protectedやinternalの意味。アクセス修飾子について

投稿2019/10/18 05:02

KanazawaKureha

総合スコア368

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

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

yrema

2019/10/18 05:13 編集

ありがとうございます。 実際に使用したいシチュエーションとしては、Xamarin.iOSでViewController間でパメーターとして渡すオブジェクトが渡した後で変更されると前画面でも表示が変わってしまいテストケースが増えてしまうので事前に禁止したいということです。
guest

0

プロジェクトを2つ作り(アセンブリを分けて)、ClassAClassPのプロジェクトとClassBのプロジェクトに分けます。

ClassPNameプロパティのsetのアクセス修飾子をinternalにすることで、Nameプロパティへセットできるのは同じプロジェクト(アセンブリ)内からに限定できます。

public string Name { get; internal set; }

(docs.microsoft.com)internal (C# リファレンス)

投稿2019/10/18 05:17

Y.H.

総合スコア7914

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問