[C#] MDI Child singleton, maar dan met inheritance

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01 11:03

Lorn

I have a bad feeling...

Topicstarter
Ik ben bezig met een MDI applicatie en wil dat ieder child form maar een keer getoond mag worden. Om dit voor elkaar te krijgen verander ik de constructor van public naar private en voeg ik de volgende code toe aan het form:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private static readonly object padlock = new object();
private static MdiChild _instance = null;

public static MdiChild GetInstance
{
    get
    {
        lock (padlock)
        {
            if (_instance == null)
            {
                _instance = new MdiChild();
                _instance.FormClosed += delegate { _instance = null; };
            }
        }
        return _instance;
    }
}


Dit werkt goed en voldoet prima aan de eisen die ik heb. Omdat deze code in elk child form moet komen leek het me een mooie candidaat voor inheritance. Ik heb een nieuw form aangemaakt, MdiChildBase, en heb de code voor mijn singleton hier in geplaatst (en natuurlijk MdiChild overal vervangen door MdiChildBase). Vervolgens heb ik MdiChild niet laten overerven van Form maar van MdiChildBase.

Helaas ging het hier mis. Omdat MdiChildBase een instance aanmaakt van MdiChildBase en dus niet van MdiChild en deze twee niet naar elkaar geconverteerd kunnen worden. Ik heb gezocht maar kan nergens iets vinden wat een oplossing zou kunnen zijn.

Is er een manier om de code in MdiChildBase zo te schrijven dat deze een instance terug geeft van het form dat MdiChildBase inherit?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:57
Je moet je eens afvragen in hoeverre je singleton nog opgaat als class B en class C een class A (waar je je singleton functionalteit in implementeert) is. :)
Als je een class B instantieert (die een class A is (inherit)), kan je dan nog een class C instantieren, want het is ook een class A ? ....

Ikzelf blijf erbij dat inheritance van singletons gewoon onnuttig is / niet klopt.
Er is hier trouwens in het verleden reeds een boompje over opgezet:
[OO] Implementatie Singleton pattern

http://msmvps.com/blogs/j...ingleton_inheritance.aspx

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • marcelk
  • Registratie: December 2000
  • Niet online
Constructor protected maken? Dan kan een derived class wel een instantie van de parent class aanmaken.

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Sowieso kun je static methoden niet inheriten. Het gevolg is dat de singleton code dus alleen in de base class terug te vinden is. Dus of je moet met aggregatie werken, waarbij je een set van childs bij kunt houden die je uniek maakt op typenaam.

Dus een collection van child classes in de base class bijhouden. Maar waarom zou je dan nog willen inheriten van de base class? En het is eigenlijk idd geen Singleton meer.

Acties:
  • 0 Henk 'm!

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01 11:03

Lorn

I have a bad feeling...

Topicstarter
OK, duidelijk... niet de juiste oplossing dus voor wat ik zoek. Dus het komt er min of meer op neer dat ik gewoon in elk form dezelfde code moet plakken? Het artikel van Jon Skeet heb ik gelezen maar geloof niet dat ik het helemaal heb begrepen...