Domanda

Ho due app per console, Query e Update, che condividono alcune funzionalità. Volevo che le due classi fossero ereditate da una classe base comune, ma il problema è che, per un'app console, devo avere una funzione static Main . Quello che ho attualmente è il seguente:

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) { ... }
...

Mi sembra sia un problema di progettazione ereditare sia da ConsoleBase che avere un'istanza come variabile statica all'interno di ogni classe derivata. Il motivo per cui lo sto facendo è che:

  1. Posso avere metodi statici protetti definiti in ConsoleBase che sono accessibili ad altri metodi statici nelle classi derivate.
  2. Posso passare gli argomenti della riga di comando al costruttore per ConsoleBase , fare cose comuni e quindi accedere nuovamente agli argomenti nelle classi derivate tramite proprietà e metodi public sull'istanza di ConsoleBase .

Quindi nelle classi derivate, ho una combinazione di chiamate a metodi / proprietà sull'istanza di ConsoleBase , ad esempio

_consoleBase.UseDebugMode()

Oltre a chiamare metodi statici ereditati e accedere a costanti ereditate che sono definite in ConsoleBase , ad esempio

printWarning(CONST_MSG_IN_BASE_CLASS);

Posso ripulirlo in qualche modo? È male ereditare sia da una classe sia mantenere un'istanza di quella classe di base con cui lavorare?

È stato utile?

Soluzione

Non mescolare metodi statici e di istanza come questo.

Considera, separando la responsabilità che i metodi statici forniscono in una classe diversa da cui puoi ereditare. Rendi la funzionalità non statica una classe separata che aggreghi e crei un'istanza in Aggiornamento e query.

Inoltre, se Update e Query sono derivati ??di ConsoleBase, perché sono necessarie le istanze aggregate?

Altri suggerimenti

Sì, puoi definire una classe base con un main statico protetto, quindi chiamare BaseClass.Main (args) dal metodo Main nelle classi ereditarie.

Questa sintassi è più corretta:

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
    }
}

Non penso che tu debba farlo. Perché non chiami semplicemente la funzione ConsoleBase.Main () con gli argomenti della tua riga di comando?

Avere un'istanza della classe base è un problema di progettazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top