Pregunta

Tengo dos aplicaciones de consola, Consulta y Actualización, que comparten algunas funciones. Quería que las dos clases heredaran de una clase base común, pero el problema es que, para una aplicación de consola, tengo que tener una función static Main . Lo que tengo actualmente es lo siguiente:

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 un problema de diseño para mí tanto heredar de ConsoleBase como tener una instancia de este como una variable static dentro de cada clase derivada. La razón por la que hago esto es para que:

  1. Puedo tener métodos estáticos protegidos definidos en ConsoleBase que son accesibles para otros métodos static en las clases derivadas.
  2. Puedo pasar argumentos de línea de comandos al constructor de ConsoleBase , hacer cosas comunes y luego acceder a los argumentos nuevamente en las clases derivadas a través de propiedades y métodos public en la instancia de ConsoleBase .

Entonces, en las clases derivadas, tengo una mezcla de llamadas a métodos / propiedades en la instancia de ConsoleBase , por ejemplo

_consoleBase.UseDebugMode()

Además de llamar a métodos estáticos heredados y acceder a constantes heredadas que se definen en ConsoleBase , por ejemplo

printWarning(CONST_MSG_IN_BASE_CLASS);

¿Puedo limpiar esto de alguna manera? ¿Es malo tanto heredar de una clase como mantener una instancia de esa clase base para trabajar?

¿Fue útil?

Solución

No mezcle métodos estáticos y de instancia como este.

Considere la posibilidad de separar la responsabilidad que proporcionan los métodos estáticos en una clase diferente de la que puede heredar. Convierta la funcionalidad no estática en una clase separada que agregue y cree una instancia dentro de Actualización y Consulta.

Además, si Update y Query son derivados de ConsoleBase, ¿por qué necesita las instancias agregadas?

Otros consejos

Sí, puede definir una clase base con una principal estática protegida, luego llamar a BaseClass.Main (args) desde el método Main en las clases hereditarias.

Este syntex es más correcto:

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

No creo que necesites hacer eso. ¿Por qué no simplemente llama a la función ConsoleBase.Main () con sus argumentos de línea de comando?

Tener una instancia de la clase base es un problema de diseño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top