###前提・実現したいこと
以下のソースが前提となります。
プロジェクトはProject1、Project2、Project3...とあり、
各プロジェクトにMessageProviderクラス及びMessageKind列挙型を実装します。
また、各プロジェクトからLowLevelAssembly名前空間を参照します。
C#
1namespace Project1 2{ 3 static class MessageProvider 4 { 5 public const int FirstErrorIndex = 20001; 6 public const int FirstInfoIndex = 10001; 7 8 public static LowLevelAssembly.MessageData GetMessageData(MessageKind messageKind) 9 { 10 return new LowLevelAssembly.MessageData 11 { 12 Id = getId(messageKind), 13 Message = getMessage(messageKind), 14 MessageLevel = getMessageLevel(messageKind) 15 }; 16 } 17 18 private static string getMessage(MessageKind messageKind) 19 { 20 switch (messageKind) 21 { 22 case MessageKind.TaskDone: 23 return "all tasks are done"; 24 case MessageKind.CommandLineArgumentsError: 25 return "need some command-line arguments"; 26 case MessageKind.SpecialError: 27 return "failed to backup log files"; 28 default: 29 throw new ArgumentException("undefined"); 30 } 31 } 32 33 private static LowLevelAssembly.MessageLevel getMessageLevel(MessageKind messageKind) 34 { 35 var id = getId(messageKind); 36 if (id < FirstInfoIndex) 37 throw new ArgumentException("implimentation error"); 38 return id < FirstErrorIndex ? 39 LowLevelAssembly.MessageLevel.Info : 40 LowLevelAssembly.MessageLevel.Error; 41 } 42 43 private static int getId(MessageKind messageKind) 44 { 45 return (int)messageKind; 46 } 47 } 48 49 enum MessageKind 50 { 51 TaskDone = MessageProvider.FirstInfoIndex, 52 CommandLineArgumentsError = MessageProvider.FirstErrorIndex, 53 SpecialError 54 } 55} 56 57namespace LowLevelAssembly 58{ 59 public class MessageData 60 { 61 public string Message { get; set; } 62 public MessageLevel MessageLevel { get; set; } 63 public int Id { get; set; } 64 } 65 66 public enum MessageLevel 67 { 68 Info, 69 Error 70 } 71}
MessageProviderクラスに実装されているメソッドのうち、何らかの良い方法で
以下のメソッドを共通化することが今回実現したいことです。
- GetMessageData
- getId
- getMessageLevel
##課題
継承を利用すれば、getMessageを抽象メソッドとして宣言し、FirstErrorIndex・LastErrorIndexは
抽象プロパティとして宣言することで解決に向かいそうですが、静的クラスのままでは継承できません。
そして、MessageProviderクラスは論理的に静的クラスであるべきだと現状では考えています。
また、MessageKindについて、列挙型は継承もインターフェースの実装も行うことができないため、
メソッドの引数には列挙型の基本クラスであるEnum抽象クラスを指定しなければなりません。
つまり、getId(DayOfWeek.Friday)のようなコードをコンパイルエラーとすることができません。
以上のような考察のもと、よりよいプログラミングを学びたいと思い、質問させて頂きました。
ご回答をお待ちしております。よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。