C#コンソールアプリ間で機能を共有
-
05-07-2019 - |
質問
いくつかの機能を共有するQueryとUpdateの2つのコンソールアプリがあります。 2つのクラスに共通の基本クラスを継承させたかったのですが、問題は、コンソールアプリの場合、 static Main
関数が必要になることです。現在私が持っているものは次のとおりです。
namespace Utils
{
public class ConsoleBase
{
protected const int ERROR_EXIT_CODE = 1;
protected static void printWarning(string msg) {...}
public ConsoleBase(IEnumerable<string> args) { ... }
...
namespace Update
{
class Update : ConsoleBase
{
private static ConsoleBase _consoleBase;
public static void Main(string[] args) { ... }
...
namespace Query
{
class Query : ConsoleBase
{
private static ConsoleBase _consoleBase;
public static void Main(string[] args) { ... }
...
ConsoleBase
を継承するだけでなく、各派生クラス内で static
変数としてインスタンスを持つことは、設計上の問題のようです。これを行う理由は次のとおりです。
-
ConsoleBase
で定義されたprotected static
メソッドを使用して、派生クラスの他のstatic
メソッドにアクセスできます。 - コマンドライン引数を
ConsoleBase
のコンストラクタに渡し、一般的なことを行い、public
プロパティとメソッドを介して派生クラスの引数に再度アクセスできますConsoleBase
のインスタンス。
そのため、派生クラスでは、 ConsoleBase
のインスタンスのメソッド/プロパティの呼び出しが混在しています。たとえば、
_consoleBase.UseDebugMode()
継承された静的メソッドを呼び出し、 ConsoleBase
で定義されている継承された定数にアクセスするだけでなく、例:
printWarning(CONST_MSG_IN_BASE_CLASS);
これを何らかの方法でクリーンアップできますか?クラスから継承するだけでなく、作業のためにその基本クラスのインスタンスを保持することは悪いですか?
解決
このような静的メソッドとインスタンスメソッドを混在させないでください。
静的メソッドが提供する責任を、継承可能な別のクラスに分離することを検討してください。非静的機能を、UpdateおよびQuery内で集約およびインスタンス化する別個のクラスにします。
さらに、UpdateとQueryがConsoleBaseの派生物である場合-なぜ集約インスタンスが必要なのですか?
他のヒント
はい、保護された静的メインで基本クラスを定義し、継承クラスのMainメソッドからBaseClass.Main(args)を呼び出すことができます。
この構文はより正確です:
public class BaseApp
{
public static Main(String[] args)
{
// TODO: ...
}
}
public class App1 : BaseApp // Same for App2
{
// There is no need to keep a reference of the base class
// if you are accessing static methods only
public static Main(String[] args)
{
BaseApp.Main(args); // Access via class, not via instance
}
}
そうする必要はないと思います。コマンドライン引数を指定してConsoleBase.Main()関数を呼び出すだけではどうですか?
基本クラスのインスタンスを持つことは設計上の問題です。