質問

いくつかの機能を共有する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 変数としてインスタンスを持つことは、設計上の問題のようです。これを行う理由は次のとおりです。

  1. ConsoleBase で定義された protected static メソッドを使用して、派生クラスの他の static メソッドにアクセスできます。
  2. コマンドライン引数を 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()関数を呼び出すだけではどうですか?

基本クラスのインスタンスを持つことは設計上の問題です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top