funzionalità condivisa tra le app della console C #
-
05-07-2019 - |
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:
- Posso avere
metodi statici protetti
definiti inConsoleBase
che sono accessibili ad altri metodistatici
nelle classi derivate. - 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 metodipublic
sull'istanza diConsoleBase
.
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?
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.