Frage

Ich habe eine Klasse, die einige Funktionen in irgendeiner Weise verkapselt werden muss.

Ich war von einer verschachtelten Klasse denken, und diese Funktionalität stellen sowie einige Staaten hinein. Die Beziehung zwischen diesen beiden Klassen ist eine Eins-zu-eins.

Das Problem für den Zugriff auf die äußeren Klasse Membervariablen oder Methoden sollten sie static deklariert werden, und ich will es nicht. Eine andere Lösung ist, eine Referenz von der äußeren zur inneren Klasse Klasse übergeben.

Was ist die beste Praxis für mein Problem?

War es hilfreich?

Lösung 3

using System;

class OuterType
{
    private static OuterType _instance;

    public OuterType()
    {
        _instance = this;
    }

    private String Message
    {
        get { return "Hello from OuterType"; }
    }

    public void testInnerType()
    {
        InnerType innerType = new InnerType();
        Console.WriteLine(innerType.FormattedOutertMessage);
    }

    private class InnerType
    {
        private readonly OuterType _outerType = _instance;

        public String FormattedOutertMessage
        {
            get { return _outerType.Message.ToUpper(); }
        }
        // InnerType doesn't need to dispose any object of OuterType.
    }
}

Dann funktioniert es wie folgt aus:

class Program
{
    static void Main(string[] args)
    {
        OuterType outerType = new OuterType();
        outerType.testInnerType();
        Console.ReadKey();
    }
}

Aber ich bin nicht sicher, ob dies eine gute Idee ist oder nicht?!

Andere Tipps

Auch wenn ich nicht als so weit gehen würde, zu sagen, dass verschachtelte Klassen böse sind, können sie sicher sein, „boshaft“, und es gibt nur sehr wenige Probleme, dass eine verschachtelte Klasse, die nicht anders gelöst werden könnte lösen oder mehr elegant .

So ist es hängt wirklich von Ihrer spezifischen Situation, aber einige Dinge zu beachten sind:

  1. Ist die verschachtelte Klasse geht öffentlich sichtbar sein? Dies sind unhandlich aufgrund der Syntax Verbraucher verwenden müssen, um die verschachtelte Art zu verweisen: OuterType + InnerType

  2. Die Quelldateien größer werden im Durchschnitt und sind schwerer zu lesen und Grund zu (obwohl dies durch den strategischen Einsatz von Teilklassen gemildert werden kann).

  3. Code-Analyse in Visual Studio wird laut über öffentliche verschachtelte Klassen beschweren (sie sind nicht gut in Form von den Rahmen-Design-Richtlinien Leuten betrachtet), so dass, wenn Sie FxCop verwenden Sie Ausnahmen machen müssen.

Wenn Sie einige weitere Besonderheiten zu veröffentlichen, könnten wir in der Lage sein, ausführlichere Anleitung zu geben.

Wir hatten genau das gleiche Problem etwa 6 Monate, aber aus einem anderen Grunde. Wir hatten etwa 20 ‚normale‘ Klassen und eine riesige Jupiter bemessen Klasse, die Art und Weise tat, viel, viel zu viel und werden muß abgebaut werden.

Wir brauchen eigentlich zwei Kinder, zusätzlich zu den Eltern, mit den beiden Kindern in einer 1-zu-1-Beziehung zu dem Elternteil.

Der erste Versuch (die Arbeit getan hat) verwendet, um die Old-School-Muster eine Referenz von ‚dies‘ der Weitergabe im Konstruktor jeden Kind, und dann eine .Parent Methode navigate wieder nach oben mit. Das war ein Alptraum wegen GC Problemen und suchten wir nach einer besseren Lösung in kurzer Zeit.

Die beste Lösung (die heute noch verwendet wird) war einfach eine Referenz der in Methoden der Kinder Klassentyp der Eltern übernehmen, die die Eltern zu fragen brauchte. Das funktionierte fantastisch gut, die GC mochte es, und alles instanziert und Recht befreit, wie erwartet. Der Code ist handlicher, und vieles mehr organisiert, und wir sind jetzt wirklich froh, dass wir die Investition in Zeit gemacht, es zu tun.

So, das wäre meine Empfehlung:

Parent
 |
 +-Child1
 |
 +-Child2

Mit Methoden des Kindes Objekte einen Verweis auf die übergeordnete Klasse akzeptieren nur in Methoden, die es brauchen.

Es ist eigentlich ein viel wie die Art und Weise, dass ADO.Net entwickelt, mit unabhängigen Objekten, die Verweise auf sich in Methoden annehmen, wenn sie benötigt werden.

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