Frage

Ich habe zwei Konsolenanwendungen, Query und aktualisiert, dass Aktien einiger Funktionen. Ich wollte die beiden Klassen von einer gemeinsamen Basisklasse erben haben, aber das Problem ist, dass für eine Konsole-app, ich habe eine static Main Funktion haben. Was ich zur Zeit habe, ist die folgende:

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

Es scheint wie ein Design-Problem für mich sowohl von ConsoleBase erben als auch haben eine Instanz davon als static Variable innerhalb jeder abgeleiteten Klasse. Der Grund, warum ich das tue ist, so dass:

  1. Ich kann in protected static definiert ConsoleBase Methoden, die auf andere static Methoden in den abgeleiteten Klassen zugänglich sind.
  2. I entlang Befehlszeilenargumente an den Konstruktor für ConsoleBase passieren kann, tut gemeinsame Sachen, und dann die Argumente wieder Zugang in den abgeleiteten Klassen über public Eigenschaften und Methoden auf der Instanz von ConsoleBase.

So in den abgeleiteten Klassen, ich habe eine Mischung von Anrufen an Methoden / Eigenschaften für die Instanz von ConsoleBase, z.

_consoleBase.UseDebugMode()

Neben Aufruf geerbt statische Methoden und den Zugriff auf vererbte Konstanten, die in ConsoleBase definiert sind, z.

printWarning(CONST_MSG_IN_BASE_CLASS);

Kann ich das irgendwie reinigen up? Ist es schlecht, sowohl von einer Klasse erbt sowie eine Instanz der Basisklasse halten um für die Arbeit mit?

War es hilfreich?

Lösung

Legen Sie keine statischen und Instanzmethoden wie diese.

Man denke Trennung der Verantwortung, dass die statischen Methoden bieten in eine andere Klasse, die Sie erben können. Machen Sie das nicht-statische Funktionalität eine eigene Klasse, die Sie aggregieren und instanziiert innerhalb aktualisieren und Abfrage.

Außerdem, wenn Update und Abfrage sind Derivate von ConsoleBase - warum brauchen Sie die aggregierten Instanzen

Andere Tipps

Ja, Sie können eine Basisklasse mit einer geschützten statischen Haupt, dann rufen BaseClass.Main (args) aus dem Hauptverfahren in den Vererbungsklassen definieren.

Dieses syntex ist richtiger:

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

Ich glaube nicht, dass Sie tun müssen. Warum gehst du nicht einfach die ConsoleBase.Main nennen () -Funktion mit dem Kommandozeilenargumente?

eine Instanz der Basisklasse zu haben, ist ein Design-Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top