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

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

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

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

1058閲覧

C#で子クラスの列挙子を使用するにはどうすればよいのか?

GrayWingAliance

総合スコア218

C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2017/08/25 12:13

編集2017/08/25 13:16

C#にて子クラスの列挙子を親側で使いたいのですがどうしたらよいでしょうか?

.NET Frameworkは4.6.1です。
使用する方法
もしくはその他解決策などありましたら、教えていただきたいです

メソッド名クラス名などは仮ですが、コードは以下のような形になっています。

c#

1// AbstractFactory.cs 2 3public abstract class AbstractFactory{ 4 byte property1; 5 byte property2; 6 public AbstractFactory(){ 7 property1 = 0x00; 8 property2 = 0x01; 9 } 10 public virtual void CreateFromA(A createBy){ 11 var enumName = Enum.GetName(typeof(A), createBy); 12 if (Enum.TryParse(enumName, true, out B created)) 13 property1 = created; 14 else 15 throw Exception(); 16 } 17 public virtual void CreateFromB(B createBy){ 18 var enumName = Enum.GetName(typeof(B), createdBy); 19 if (Enum.TryParse(enumName, true, out A created)) 20 property1 = created; 21 else 22 throw Exception(); 23} 24 25// Factory1.cs 26public class Factory1():AbstractFactory{ 27 public Factory1(){ 28 property2 = 0x08; 29 } 30 public enum A{ 31 ko = 0x11, 32 otsu = 0xa0, 33 hei = 0xc0, 34 tei = 0xff 35 } 36 public enum B{ 37 ko = 0x12, 38 otsu = 0x13, 39 hei = 0x14, 40 tei = 0x15 41 } 42} 43 44// Factory2.cs 45public class Factory2(): AbstractFactory{ 46 public Factory2(){ 47 property2 = 0x08; 48 } 49 public enum A{ 50 rin = 0x00, 51 pyo = 0x08, 52 to = 0x10, 53 sha = 0x18, 54 kai = 0x20, 55 jin = 0x28, 56 retsu = 0x30, 57 zai = 0x38, 58 zen = 0x40 59 } 60 public enum B{ 61 rin = 0x02, 62 pyo = 0x09, 63 to = 0x12, 64 sha = 0x13, 65 kai = 0x52, 66 jin = 0x62, 67 retsu = 0xa0, 68 zai = 0x3f, 69 zen = 0x99 70 } 71}

newしたときに列挙子を読み替えたいです。

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

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

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

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

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

guest

回答2

0

こんにちは。

インスタンス化するクラスの配下に定義しているenumを抽象クラスから選択して読みたいということだと理解しました。
これは不可能です。
C#のenumは定数の表現のようなものであり、拡張性が全くと言っていいほど無いです。
クラス内に宣言したクラスは、アクセシビリティが特殊なだけで単なるクラスなので、抽象化ができないenumは読み替え等を行うことは出来ません。
Factory1のAとFactory2のAは名前が少し似ているだけでお互いに全く関係がないのです。
このような要件を実現するにはenum以外を利用する方法を考えてください。

投稿2017/08/25 15:41

編集2017/08/25 15:47
tamoto

総合スコア4103

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

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

0

ベストアンサー

子クラスで宣言したenumを親classで使いたいのですよね。
それだけ大量のサンプルを書いたのであれば具体的に親クラスのクラス名と子クラスのどのenumを親クラスのどの位置で使いたいのか記述したほうがいいです。

子クラス自体はpublicで宣言されていて、子クラスの内部にpublicでenumが宣言されているので、子class内部のenumはどこからでも参照可能です。

子クラス名.enum名 が型名になります。

C#

1Factory1.A a = Factory1.A.ko

やりたいこととサンプルを完結に書きましょう

C#

1public class Parent { 2 public Parent() { 3 //ここで Aを使いたい 4 } 5} 6 7public class Child: Parent { 8 public enum A { 9 Ko, 10 Otsu 11 } 12} 13

投稿2017/08/25 12:37

Tak1016

総合スコア1408

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

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

GrayWingAliance

2017/08/25 13:18

上記の通り、列挙子をnewするclassによって読み替えたいのです。 もしお時間あれば、コメントいただけると幸いです。
Tak1016

2017/08/25 15:32

んー だからどうしたいのかをちゃんと書いてくださいって。 上のコードだと親クラスは単にbyteの値を持ってるだけじゃないですか。 enum -> byteの変換がしたいのか enumとして扱いたいのか。 byteとして扱いたいなら (byte)aとかキャストしておしまい。
GrayWingAliance

2017/08/25 15:45

enumかbyte変換かの問題以前にこの方法で、子クラス毎のenum値は読み出せません。 Enumを通常の値クラスと勘違いされてませんか?
Tak1016

2017/08/25 15:50

> enumかbyte変換かの問題以前にこの方法で、子クラス毎のenum値は読み出せません。 > Enumを通常の値クラスと勘違いされてませんか? んーと、ちゃんとどの箇所が問題なのかを書かないとわかんないんだって > public virtual void CreateFromA(A createBy) // このAをFactory1のときはFactory1.A として、Factory2のときはFactory2.A として処理したい っていうそういうコメントを書いてくれと言っている。 質問を省略しすぎ
Tak1016

2017/08/25 15:51

で、上記の通りの質問の意味と勝手に解釈するなら  無理です。
GrayWingAliance

2017/08/25 16:06

なるほど。 私の言葉が大分足りなかったようです。大変失礼しました。 参考URL読ませていただきましたが、中々興味深かったです。 ありがとうございました。
GrayWingAliance

2017/08/25 16:08

あ、けど、継承と逆なんで、this.GetInstance.GetPropertyとかで、行けますかね?ちょっと家ついたら、やってみます。
GrayWingAliance

2017/08/25 16:11

ん、ちがう。class内classだから、GetInstance.GetInstanceか、、、無理そうなんでダメなら、Dictionary 使います。
Tak1016

2017/08/26 10:17

RelfectionにActivatorというクラスがあって動的にインスタンスをnewできる仕組みも一応あることはある。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問