Je zou eventueel met een abstract factory kunnen werken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| class abstract MyAbstractClass
{
protected IClassFactory _factory;
private MyAbstractClass()
{
_factory = null;
}
public static MyAbstractClass GetInstance( DateTime validationDate )
{
if( validationDate < DateTime.Now )
{
return null;
}
else
{
_factory.CreateInstance();
}
}
}
public class ConcreteClassA : MyAbstractClass
{
private ConcreteClass() : base()
{
_factory = new ConcreteClassAFactory();
}
} |
Zoals je kunt zien, laat je het creeëren van je instances van ConcreteClassA over aan een andere class, een zgn factory.
Die factory ziet er bv zo uit:
code:
1
2
3
4
| interface IClassFactory
{
MyAbstractClass CreateInstance();
} |
Je zult dus voor iedere 'concrete class' die je maakt, zo'n factory class moeten maken.
Die factory class creeërt dus instanties van die ConcreteClass voor je. Echter, je hebt wel een private constructor, dus je zit met een probleem.
Nu kan je 2 dingen doen: of je zorgt ervoor dat die ConcreteClasses en je Factories in eenzelfde assembly zitten, en je maakt je constructor internal ipv private; dan kan je je factories je objecten gewoon laten creeëren.
Ofwel maak je instanties aan van die classes via reflection. Dmv Reflection kan je die private constructor aanroepen:
code:
1
2
3
4
5
6
7
| class ConcreteClassAFactory : IClassFactory
{
public MyAbstractClass CreateInstance()
{
return Activator.CreateInstance (typeof(ConcreteClassA), true);
}
} |
edit:
disclaimer: uit de losse pols getyped, dus er zullen wel nog compilatie-fouten inzitten, maar het moet je wel toelaten om het basisidee te snappen
[
Voor 6% gewijzigd door
whoami op 07-01-2005 13:28
]