[VB.NET] Destroy class

Pagina: 1
Acties:

  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Ik wil in een class zorgen dat deze wordt vernietigd bij bepaalde dingen waarop ik controleer in de sub new van de class.

Dat wil dus zeggen, dat de members van die class niet meer aan te spreken zijn door de aanroeper, als de controle in new niet correct wordt doorstaan.

Is dat mogelijk?
(heb al gezocht op google, msdn library en GoT)

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 09:50

pjvandesande

GC.Collect(head);

Ik snap het niet, wil je de class gewoon uit het geheugen halen (Disposen)? Als jij een exception thowed iets van, ArgumentException word de class niet verder geinstantieerd en ruimt de Garbage Collector de boel weer netjes voor je op.

  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Ja ik dacht ook disposen maar dat werkt niet, of ik doe iets verkeerd.
Als ik dan een sub call van die class voert hij die doodleuk uit als hij gedisposed is.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 09:50

pjvandesande

GC.Collect(head);

Scorpion1984 schreef op donderdag 06 januari 2005 @ 16:16:
Ja ik dacht ook disposen maar dat werkt niet, of ik doe iets verkeerd.
Als ik dan een sub call van die class voert hij die doodleuk uit als hij gedisposed is.
Dan implementeer je Dispose niet goed. Wat wil je precies, ik snap het niet helemaal?

Bij een exception gooit de Garbage Collector alles voor je weg hoor.

  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Een soort licensie systeem zeg maar.

Ik wil dat de class in de dll niet meer aanroepbaar is na een bepaalde datum.

  • whoami
  • Registratie: December 2000
  • Nu online
Je bent gewoon aan het prutsen.
Je gebruikt dingen waarvoor ze imo niet voor gemaakt zijn; je moet niet in je constructor je object proberen te 'disposen' of whatsoever.

https://fgheysels.github.io/


Verwijderd

Een oplossing die ik zo direct voor ogen zie is devolgende :

Je maakt de constructor private en maakt een publieke statische methode op de klasse,
bv GiveInstance()

die retourneert een instantie van die klasse

Het voordeel van deze omweg is dan dat je gemakkelijk kan implementeren dat de statische methode null moet terug geven ipv een bepaalde instantie indien een bepaalde datum overschreden is.

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op donderdag 06 januari 2005 @ 17:16:
Je maakt de constructor private en maakt een publieke statische methode op de klasse,
bv GiveInstance()
Of een property :P

Maar dit is idd een veel betere oplossing. Op die manier ga je niet gaan 'foefelen'; het is ook heel wat robuuster.

https://fgheysels.github.io/


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Verwijderd schreef op donderdag 06 januari 2005 @ 17:16:
Een oplossing die ik zo direct voor ogen zie is devolgende :

Je maakt de constructor private en maakt een publieke statische methode op de klasse,
bv GiveInstance()

die retourneert een instantie van die klasse

Het voordeel van deze omweg is dan dat je gemakkelijk kan implementeren dat de statische methode null moet terug geven ipv een bepaalde instantie indien een bepaalde datum overschreden is.
Is mooi bedacht, maar dat kan niet. Die statische methode kan net zo goed de contructor niet aanroepen.

  • whoami
  • Registratie: December 2000
  • Nu online
Scorpion1984 schreef op donderdag 06 januari 2005 @ 17:41:
[...]


Is mooi bedacht, maar dat kan niet. Die statische methode kan net zo goed de contructor niet aanroepen.
En waarom zou die statische methode de constructor niet kunnen aanroepen ? Dat kan ze wel, want die statische methode is ook een member vn de class.
Het Singleton pattern is trouwens op dit idee gebaseerd.

https://fgheysels.github.io/


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
als die methode member van die class is kan ik die niet aanroepen. Aangezien vb dan zegt dat ik eerst een instance van het object moet hebben.

Daarbij, als het wel zou kunnen, kan je nog steeds alle functies aanroepen in die class.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14:58

gorgi_19

Kruimeltjes zijn weer op :9

Scorpion1984 schreef op donderdag 06 januari 2005 @ 18:36:
als die methode member van die class is kan ik die niet aanroepen. Aangezien vb dan zegt dat ik eerst een instance van het object moet hebben.

Daarbij, als het wel zou kunnen, kan je nog steeds alle functies aanroepen in die class.
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        Public Class Melp

            Private Sub New()
            End Sub

            Public Shared Function Create() As Melp

                Return New Melp

            End Function

            Public ReadOnly Property Test() As String
                Get
                    Return "melp"
                End Get
            End Property

        End Class

:?

Geef een parameter mee aan Create en controleer in create of je een instance terug geeft of niet. Buiten dit: Je kan met null objects gaan werken. Maak een abstracte class, creeer je 'echte' class en een null class. Bij een goede aanroep return je de echte class, anders de null class. Maar ik vraag wat je nu precies wilt en waarom de factory methodiek niet goed is.

[ Voor 20% gewijzigd door gorgi_19 op 06-01-2005 18:43 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Nu online
Scorpion1984 schreef op donderdag 06 januari 2005 @ 18:36:
als die methode member van die class is kan ik die niet aanroepen. Aangezien vb dan zegt dat ik eerst een instance van het object moet hebben.
Die method is static (shared in VB.NET).
Daarbij, als het wel zou kunnen, kan je nog steeds alle functies aanroepen in die class.
Nee, als je geen object krijgt van die class, kan je ook geen functies aanroepen.

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
class Test
{

     private Test()
     {
     }

      public Test Instance
      {
           get
           {
               if( DateTime.Now > aGivenDate )
               {
                       return null;
               }
               else
              {
                      return new Test();
              }
           }
     }

     public void DoSomething()
     {
     }

}


Hiermee kan je niet zomaar een object maken van het type Test, maar moet je via de Instance property gaan:

code:
1
2
3
4
5
6
7
8
9
Test t = Test.Instance;
if( t != null )
{
       t.DoSomething();
}
else
{
        MessageBox.Show ("licence period expired.");
}

https://fgheysels.github.io/


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
gorgi_19 schreef op donderdag 06 januari 2005 @ 18:41:
[...]

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        Public Class Melp

            Private Sub New()
            End Sub

            Public Shared Function Create() As Melp

                Return New Melp

            End Function

            Public ReadOnly Property Test() As String
                Get
                    Return "melp"
                End Get
            End Property

        End Class

:?

Geef een parameter mee aan Create en controleer in create of je een instance terug geeft of niet. Buiten dit: Je kan met null objects gaan werken. Maak een abstracte class, creeer je 'echte' class en een null class. Bij een goede aanroep return je de echte class, anders de null class. Maar ik vraag wat je nu precies wilt en waarom de factory methodiek niet goed is.
Ja dat werkt.
Maar als je een abstracte class gebruikt hoe krijg je dan de goede class terug.

Wat ik bedoel is dat ik een abstracte class met de functie die die instance teruggeeft maak, zodat ik dit niet voor elke class apart moet gaan doen. (Het zijn namelijk meerdere classes in 1 dll). Is dat mogelijk?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Wat wil je nou precies bereiken :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
drm schreef op donderdag 06 januari 2005 @ 21:43:
Wat wil je nou precies bereiken :?
Ik wil meedere classes in 1 dll file beveiligen, zonder die code er elke keer per class in te zetten, is ook niet handig als ik iets in die controle wil wijzigen. Daarom dacht ik aan een abstracte class of een basis class inherit(-en, ja weet het, het is geen werkwoord) Zodat ik makkelijk die controle kan wijzigen

Verwijderd

Dus:
1 dll, waarin ALLE classen pas mogen draaien als hij binnen licentie is.
Ken zoiets dan niet (in denkbeeldige taal):

class x
constructor: haakt af als niet binnen licentieperiode is

class y extends x
class z extends x

en zo verder?
Dan update je constructor class X, en worden de andere classen dus ook aangepast qua licentiemodel.

Dat het zeg maar allemaal uitgebreide licentiecheckclassen worden

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 09:50

pjvandesande

GC.Collect(head);

Verwijderd schreef op vrijdag 07 januari 2005 @ 00:07:
Dan update je constructor class X, en worden de andere classen dus ook aangepast qua licentiemodel.

Dat het zeg maar allemaal uitgebreide licentiecheckclassen worden
Je opzet is prima, alleen zou ik dan nog wel gebruik maken van een Factory. Dus niet dat je de ctor hoeft aan te passen. Maar een GetInstance property of method.

Verwijderd

Ik heb de indruk dat je nog niet veel ervaring hebt met programmeren/VB.NET ?

Bekijk zeker eens de static (Shared) methoden heel goed, het zijn handige dingetjes.

Als iemand een tip geeft ben je best dat je eventueel eerst opzoekt wat die persoon bedoeld voordat je gaat beginnen zeggen dat de oplossing niet zou werken. Statische methoden waren u blijkbaar onbekend. In zo een geval ga je opzoeken wat statische methoden zijn, of indien je problemen het met energie stoppen in opzoeken, kan je dit ook gewoon vragen ...

Je kan volgens mij (maar ik kan mis zijn natuurlijk) in de constructor geen instantie vernietigen. Ergens wel logisch want je vraagt aan die instantie om zichzelf te vernietigen.

[EDIT] Mag ik vragen waarom je dit wil bereiken ? Ik kan me moeilijk voorstel dan een andere ontwikkelaar, iets ontwikkeld met jouw dll. Deze dan bij de klant installeert en na een aantal tijd een nieuwe versie van die dll moet gaan zetten, of een aanpassing gaan doen omdat deze dan vervallen is. Of zie ik verkeerd wat je wilt doen ?

[ Voor 20% gewijzigd door Verwijderd op 07-01-2005 08:47 ]


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 09:50

pjvandesande

GC.Collect(head);

Verwijderd schreef op vrijdag 07 januari 2005 @ 08:44:
Je kan volgens mij (maar ik kan mis zijn natuurlijk) in de constructor geen instantie vernietigen. Ergens wel logisch want je vraagt aan die instantie om zichzelf te vernietigen.
Nee, dat is niet mogelijk. Je kan wel een Exception gooien, dan word je halve instantie ook weer vernietigd. Maar dit alleen in uitzonderlijke gevallen gebruiken. Dus als er echt iets mis is met een Argument of iets.
Je moet het niet gebruiken in de werking van je applicatie, daar zijn Exceptions niet voor.

Verwijderd

questa schreef op vrijdag 07 januari 2005 @ 08:42:
[...]


Je opzet is prima, alleen zou ik dan nog wel gebruik maken van een Factory. Dus niet dat je de ctor hoeft aan te passen. Maar een GetInstance property of method.
Ik had het ook over een denkbeeldige code, heb nog nooit in VB.Net gecoded ;)

  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Sorry, dubbelpost

[ Voor 96% gewijzigd door Scorpion1984 op 07-01-2005 13:15 ]


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Verwijderd schreef op vrijdag 07 januari 2005 @ 08:44:
Ik heb de indruk dat je nog niet veel ervaring hebt met programmeren/VB.NET ?

Bekijk zeker eens de static (Shared) methoden heel goed, het zijn handige dingetjes.

Als iemand een tip geeft ben je best dat je eventueel eerst opzoekt wat die persoon bedoeld voordat je gaat beginnen zeggen dat de oplossing niet zou werken. Statische methoden waren u blijkbaar onbekend. In zo een geval ga je opzoeken wat statische methoden zijn, of indien je problemen het met energie stoppen in opzoeken, kan je dit ook gewoon vragen ...

Je kan volgens mij (maar ik kan mis zijn natuurlijk) in de constructor geen instantie vernietigen. Ergens wel logisch want je vraagt aan die instantie om zichzelf te vernietigen.
Static functies was mij inderdaad niet bekend, een static functies was zover ik wist gewoon een functie buiten de class. En daarbij ik roep niet zomaar dat het niet zou werken, ik probeer het eerst op allerelei manieren.

Met een GetInstance property of methode is ook goed, maar ik zou absoluut niet weten hoe je een algemene functies daarvoor kan maken, want wat je doet is uiteindelijk:
return new classname
Het probleem is dat die classname dus voor elke class anders is, dus hoe krijg ik dan een algemene functie?

  • whoami
  • Registratie: December 2000
  • Nu online
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 ]

https://fgheysels.github.io/


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Mmh, heb uitgebreid geprobeerd om dat te produceren, maar het lukt niet onder vb.net
En daarbij zit je nog steeds met het probleem dat je voor elke class apart de functie moet schrijven, niet dat dat veel werk is maar toch.

  • whoami
  • Registratie: December 2000
  • Nu online
Scorpion1984 schreef op vrijdag 07 januari 2005 @ 17:39:
Mmh, heb uitgebreid geprobeerd om dat te produceren, maar het lukt niet onder vb.net
Het is C# code, dus dat moet wel makkelijk om te zetten zijn naar VB.NET.
En daarbij zit je nog steeds met het probleem dat je voor elke class apart de functie moet schrijven, niet dat dat veel werk is maar toch.
Welke functie ?
Je moet gewoon in de constructor van iedere class de juiste factory initializeren, en je moet natuurlijk ook wel voor iedere class een factory class hebben.

https://fgheysels.github.io/


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
whoami schreef op vrijdag 07 januari 2005 @ 19:06:
[...]

Het is C# code, dus dat moet wel makkelijk om te zetten zijn naar VB.NET.
Nou zover ik de code kan interpreteren, kan ik het wel vb.net herschrijven, alleen dan krijg ik een hele lijst errors die ik niet allemaal kan oplossen zonder alles om te gooien
whoami schreef op vrijdag 07 januari 2005 @ 19:06:
[...]

Welke functie ?
Je moet gewoon in de constructor van iedere class de juiste factory initializeren, en je moet natuurlijk ook wel voor iedere class een factory class hebben.
Je moet dus van elke class een nieuewe factory class maken. Kan het niet gewoon 1 abstract class die voor elke class werkt.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
questa schreef op vrijdag 07 januari 2005 @ 08:47:
[...]


Nee, dat is niet mogelijk. Je kan wel een Exception gooien, dan word je halve instantie ook weer vernietigd. Maar dit alleen in uitzonderlijke gevallen gebruiken. Dus als er echt iets mis is met een Argument of iets.
Je moet het niet gebruiken in de werking van je applicatie, daar zijn Exceptions niet voor.
Een verlopen licentie is redelijk uitzonderlijk, de logica daarvan moet je niet door je hele programma verspreiden. Ik vraag me alleen af of dat goed gaat in combinatie met IDispose

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1