開発環境は Visual Studio Express 2017 for Windows Desktop
言語はC#、.NET Framework 4.7.2を使用して Windowsフォームアプリケーションを開発しています。
システム改造のため、既存クラスを基底クラスとした、「派生クラス」を作成する方向で設計をしています。
その中で、いわゆるC/C++の#define定義の代わりに定義値を多数宣言して使われているDefineクラスがあります。
Defineクラスでは多数の「const」で定義された変数が存在しています。
また、下記の例ですと各定義値 Define.MAX_LENGTH といった形で呼び出されており、
呼び出されている箇所の数・種類も多いことから、
Defineクラスの改造にあたっては、Defineクラスを基底クラスとし 改造後は派生クラスを使用することが
困難(ソースコード変更量が多すぎるため、現実的な実装ではない) と考えています。
C#
1public static class Define 2{ 3 enum EType 4 { 5 A, 6 B, 7 C, 8 All 9 }; 10 11 // ここで多数の定数定義が行われている 12 public const int MAX_LENGTH = 256; 13 public const string XXX= "XXXX"; 14 15 ・・・ 16}
呼び出し元に影響を与えないよう、Defineクラスを使用するものとし
Defineクラス内部で 2つ以上の基底クラスを継承させ
enum型の定義をそれぞれから呼び出して書き換えることはできないでしょうか?
補足 やりたいことのイメージですが、下記にサンプルコードを示します。
基底クラス Person を作り、派生クラス Employeeを作ります。
それぞれのクラスで Season という 同名の enum を用意します。
各クラス内部で それぞれに作成したSeason を使うことはできるのですが、
基底クラス・派生クラスの 呼び出し元で インスタンスを使って Seasonを指定することができないとわかりました。
上記のような実装をしたい場合の解決案について教えていただけないでしょうか。
C#
1 public partial class Form1 : Form // 実際の開発では、Defineクラス で使用する予定 2 { 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 private void btn_Click(object sender, EventArgs e) 9 { 10 Button btn = (Button)sender; 11 12 Person p; 13 14 if (btn.Name == "button1") 15 { 16 textBox1.Text = ((int)Person.Season.Max).ToString(); // ここでクラス名を指定しなければならない 17 } 18 else 19 { 20 textBox1.Text = ((int)Employee.Season.Max).ToString();// 同上 21 } 22 } 23 } 24 25 class Person //基底クラス 26 { 27 public enum Season 28 { 29 Spring, 30 Summer, 31 Autumn, 32 Winter, 33 Max 34 } 35 } 36 37 partial class Employee : Person // 派生クラス 38 { 39 string syumi; 40 string[] strSeason = { "春", "夏", "秋", "冬" }; 41 42 public new enum Season // 派生クラスのenumは明示的にnewを付ける(うっかり継承先に同名メソッドを記述していないことを明記) 43 { 44 Spring, 45 Summer, 46 Autumn, 47 Winter, 48 Max = Spring + 1 49 } 50 }