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

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

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

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

Q&A

3回答

13404閲覧

抽象クラスのstatic変数へのアクセスを継承先クラスからしか出来ないようにする方法について

buibui80

総合スコア1033

C#

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

1グッド

2クリップ

投稿2016/06/11 13:10

編集2016/06/11 14:11

抽象クラス(abstract)を利用することで、
継承しないとインスタンス化できないクラスを作成することができました。

ですが、抽象クラスのpublicなstatic変数には継承なしに直接アクセス出来てしまうので、
抽象クラスで定義したpublicなstatic変数には直接アクセス不可とし、
継承クラスを使用する側からのみ抽象クラスで定義したpublicなstatic変数にアクセス可能にするには
どの様にすれば良いでしょうか?
言葉にすると「なるほど、わからん」なので以下のソースをご確認ください。

C#

1public abstract class AAA 2{ 3 public static string name = "asd"; 4} 5 6public class BBB: AAA 7{ 8} 9 10public class CCC 11{ 12 void Start() 13 { 14 string name1 = AAA.name; // <- これはアクセス不可にしたい 15 string name2 = BBB.name; // <- これはアクセス許可したい 16 } 17}

よろしくお願い致します。

ai_2013_dev👍を押しています

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

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

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

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

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

iwamoto_takaaki

2016/06/13 00:58

どういった経緯でそうしたいのでしょうか?(動機に対してアプローチが違っている可能性があります。)
guest

回答3

0

BBBクラスの静的フィールドとして変数定義すればいいと思いますが。

そもそも基底クラスの静的フィールドなのですから、派生クラス側のフィールドとして読み書きするのは設計上おかしいと思います。(C#には特別詳しくはないですけど)

投稿2016/06/11 14:28

編集2016/06/11 14:33
HogeAnimalLover

総合スコア4830

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

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

buibui80

2016/06/12 04:17

ご回答ありがとうございます。 ソースではstring型を例にしていますが、 シングルトンな基底クラスを用途別に派生クラス化する際に、 基底クラス側にstatic変数として用意すれば派生クラス側は不要になるかなと思っていました。 その上で基底クラスにはアクセス不可に出来ないか?という趣旨で質問しましたが、 まだまだ不勉強なので見直してみようと思います。
guest

0

継承されたもの(あるいは両方)をプロパティとすれば可能です。

C#

1public abstract class AAA 2{ 3 protected static string name = "asd"; 4} 5 6public class BBB : AAA 7{ 8 public new static string name 9 { 10 get 11 { 12 return (string)typeof(AAA).GetField("name", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).GetValue(null); 13 } 14 } 15} 16

C#

1public abstract class AAA 2{ 3 protected static string name { get { return "asd"; } } 4} 5 6public class BBB : AAA 7{ 8 public new static string name 9 { 10 get 11 { 12 return (string)typeof(AAA).GetProperty("name", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).GetValue(null); 13 } 14 } 15} 16

投稿2016/06/11 14:43

Zuishin

総合スコア28660

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

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

Zuishin

2016/06/11 14:52

ただ HogeAnimalLover さんの仰るように、設計がそもそも間違ってます。 このような特殊なクラスを量産されると、メンテナンス性が落ちます。 仕様から考え直した方がよろしいかと。
buibui80

2016/06/12 04:08

ご回答ありがとうございます。 仕様の見直し(勉強)をしてみようと思います。
Zuishin

2016/06/12 12:49 編集

この件で Public な静的フィールドとして実装されている name を初期化済みインスタンスフィールドあるいはインスタンスプロパティに変更されたらどうでしょう? インスタンスメンバーであれば、インスタンス化されるまではアクセスできない、そして基底クラスはインスタンス化できない、つまり基底クラスのものはアクセスできないが、派生クラスのものはアクセスできるメンバーとなります。 ```C# public abstract class AAA { public string Name = "asd"; } public class BBB : AAA { protected BBB() {} private static BBB instance; public static BBB Create() { if (instance == null) instance = new BBB(); return instance; } } ```
guest

0

こんにちは。

staticフィールドに対して使ったことはないのですが、protectedでできる筈です。

C#

1protected static int foo;

publicは公開、privateは非公開、protectedは継承クラスへ公開って感じです。

投稿2016/06/11 13:40

Chironian

総合スコア23272

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

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

buibui80

2016/06/11 14:14

ご回答ありがとうございます。 すみません、質問の仕方が正しくありませんでした。 質問を修正しましたので良ければご一読ください。
Chironian

2016/06/11 15:07

AAAでの定義がpublicフィールドであることが必須条件でしたら、それをアクセスできないようにすることは不可能です。 AAAではprotectedでもよくて、BBBにプロパティで定義して良いなら、普通にできると思います。
buibui80

2016/06/12 04:24

ご回答ありがとうございます。 ソースではstring型を例にしていますが、 シングルトンなAAAクラスを用途別に派生クラス化(BBB)する際に、 AAA側にpublicなstatic変数として用意すればBBB側では記述が不要になるかなと思っていました。 その上でAAAのpublicなstatic変数にはアクセス不可にしたいという趣旨で質問しましたが、 不可能ということですので見直してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問