funcionalidade compartilhada entre C # consola aplicativos
-
05-07-2019 - |
Pergunta
Eu tenho duas aplicações de console, consultar e atualizar, que partilham algumas funcionalidades. Eu queria ter as duas classes herdam de uma classe base comum, mas o problema é que, para uma aplicação de console, eu tenho que ter uma função static Main
. O que eu tenho atualmente é o seguinte:
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) { ... }
...
Parece que um problema de design para mim tanto para herdar a partir ConsoleBase
, bem como ter uma instância dele como uma variável static
dentro de cada classe derivada. A razão que eu estou fazendo isso é para que:
- eu posso ter métodos
protected static
definidos noConsoleBase
que são acessíveis a outros métodosstatic
nas classes derivadas. - Eu posso passar ao longo de linha de comando argumentos para o construtor para
ConsoleBase
, fazer coisas comuns, e, em seguida, acessar os argumentos de novo nas classes derivadas via propriedadespublic
e métodos na instância doConsoleBase
.
Assim, nas classes derivadas, que tem uma mistura de chamadas para métodos / propriedades no exemplo de ConsoleBase
, por exemplo.
_consoleBase.UseDebugMode()
Além de chamar métodos estáticos herdadas e acessar constantes herdadas que são definidas no ConsoleBase
, por exemplo.
printWarning(CONST_MSG_IN_BASE_CLASS);
Posso limpar isso de alguma forma? É ruim para ambas herdam de uma classe, bem como manter uma instância dessa classe base em torno de trabalhar com?
Solução
Não misture métodos estáticos e de instância como esta.
Considere-se, separando a responsabilidade que os métodos estáticos fornecer em uma classe diferente que você pode herdar. Faça a funcionalidade não-estático uma classe separada que você agregar e instanciar dentro Update e consulta.
Além disso, se Update e consulta são derivados de ConsoleBase - por que você precisa as instâncias de agregação
?Outras dicas
Sim, você pode definir uma classe base com um protegidas estáticos principal, em seguida, chamar BaseClass.Main (args) a partir do método principal nas classes que herdam.
Esta Syntex é mais correto:
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
}
}
Eu não acho que você precisa fazer isso. Por que você não simplesmente chamar a função ConsoleBase.Main () com os seus argumentos de linha de comando?
Ter uma instância da classe base é um problema de projeto.