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:

  1. eu posso ter métodos protected static definidos no ConsoleBase que são acessíveis a outros métodos static nas classes derivadas.
  2. 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 propriedades public e métodos na instância do ConsoleBase.

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top