Page 1 of 2 1 2 LastLast
Results 1 to 15 of 18

Thread: NullReferenceException icm abstracte methodes

  1. #1

    NullReferenceException icm abstracte methodes

    Ik heb een class welke een aantal abstracte methodes heeft. Vervolgens heb ik een class welke deze implementeerd. Ik gebruik ook alleen de class welke de methodes implementeerd.
    Maar zodra ik dit wil doen krijg ik deze exceptie:
    Project TestApp.exe encountered unhandled exception class System.NullReferenceException with message 'Een type moet abstract worden gedeclareerd als een of meer van de bijbehorende methoden abstract zijn.'.
    Hoe kan dit?

  2. #2
    Hoe ziet je code ongeveer uit? Misschien moet je de methods juist virtual declareren

  3. #3
    Code:
    Code:
    type
      TDatabase = class(System.Object)
      private
        class var FInstance: TDatabase;
      protected
        class function CreateInstance: TDatabase; virtual; abstract;
      public
        class function GetInstance: TDatabase;
        procedure LoadRecord(Id: Integer; DataRecord: TDataRecord); virtual; abstract;
      end;
    
    implementation
    
    { TDatabase }
    
    class function TDatabase.GetInstance: TDatabase;
    begin
      if not Assigned(FInstance) then
        FInstance := CreateInstance;
      Result := FInstance;
    end;
    Code:
    type
      TMemoryDatabase = class(TDatabase)
      protected
        class function CreateInstance: TDatabase; override;
      public
        procedure LoadRecord(Id: Integer; DataRecord: TDataRecord); override;
      end;
    
    implementation
    
    { TMemoryDatabase }
    
    class function TMemoryDatabase.CreateInstance: TDatabase;
    begin
      Result := TMemoryDatabase.Create;
    end;
    
    procedure TMemoryDatabase.LoadRecord(Id: Integer; DataRecord: TDataRecord);
    begin
    //nog niks
    end;
    En dan gaat het mis als ik doe:
    TMemoryDatabase.GetInstance;
    Last edited by Vos; 08-Mar-05 at 20:58.

  4. #4
    Omdat de method GetInstance geen implementatie heeft in je memoryDatabase class en abstract is gedeclareerd ==> daardoor gaat volgens mij je app over de nek. Je moet de GetInstance methode implementeren of je haalt de abstract keyword weg. (Weet niet zeker of het klopt, ben namelijk meer in C# bedreven dan delphi.NET nu )

    [Edit]
    PS: Ik heb ff in de msdn en C# code gekeken over abstract ==> Het is de bedoeling dat wanneer je een method abstract definieert dat je ook de class met de abstract method ook abstract declareert. En je mag geen abstract keyword gebruiken in static classes.
    Last edited by Link; 08-Mar-05 at 21:14.

  5. #5
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    @Link: GetInstance is niet abstract gedeclareerd

    @Jelmer Vos: Het probleem zit volgens mij in de combinatie van class function en abstract. Een class function is een functie die ook van die classe kan aangeroepen worden en niet alleen van de instantie, echter zonder implementatie is er weinig aan te roepen van een classe-functie, want hoe weet TDatabase nou van welke instantie hij deze moet aanroepen?

    @Link: Oh, ik snap misschien wat je bedoelt: Een TMemoryDatabase.GetInstance override declareren en implementeren? Denk niet dat dat werkt, en is dan wel een rare constructie, want TDatabase.GetInstance rechtstreeks geeft dan nog steeds een probleem!

    [Edit] Mijn eerste post in .NET, dus bij voorbaat excuses indien onjuist .
    Last edited by NGLN; 08-Mar-05 at 21:51.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  6. #6
    je hebt totaal gelijk. Ik heb verkeerd gekeken over getinstance

  7. #7
    Hoe zorg ik ervoor dat de klasse ook als abstract is gedefineerd?

  8. #8
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Geen flauw idee. Naar mijn idee is elke klasse zo en zo al abstract, want je je kan hem toch overerven/uitbreiden? Ik snap dan ook niet wat die foutmelding precies betekent. Misschien een foutieve vertaling?

    Ja kan proberen (zoals hierboven beschreven, niet getest) om virtual/dynamic bij TDatabase.GetInstance te gebruiken en dan in TMemoryDatabase een GetInstance override te declareren.

    Mijn vorige opmerking is (denk ik) achteraf toch niet juist, want een willekeurige class function ... virtual; abstract; compileert gewoon en zal dan wel naar onder "bubbelen" in zijn dochterklassen voor de juiste implementatie. Feit blijft natuurlijk wel dat TDatabase.GetInstance gewoon niet werkt.

    Verder kan ik je helaas niet helpen, jouw code compileert niet eens bij mij . D5 kent geen class var. Maar gelukkig zijn er nog genoeg andere helden...

    [Edit]Is zoiets niet mogelijk ?
    Code:
    class function TDatabase.GetInstance: TDatabase;
    begin
      if not Assigned(FInstance) then
        if Implemented(CreateInstance) then
          FInstance := CreateInstance
        else
          FInstance := nil;
      Result := FInstance;
    end;
    Last edited by NGLN; 08-Mar-05 at 22:52.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  9. #9
    Mijn delphi 8 is kapot sinds ik visual studio heb gedeinstalleerd Maar kan je niet gewoon abstract voor class tikken? Dus in de trant van:
    TDatabase = abstract class (System.Object)

  10. #10
    Quote Originally Posted by Link
    Mijn delphi 8 is kapot sinds ik visual studio heb gedeinstalleerd Maar kan je niet gewoon abstract voor class tikken? Dus in de trant van:
    TDatabase = abstract class (System.Object)
    Nee, maar
    Code:
    type
      TDatabase = class abstract(System.Object)
    werkt wel. Helaas nog steeds dezelfde exceptie (met zelfde melding).

  11. #11
    Ik vond de volgende stukjes in de Help hierover:
    Note: The Delphi for .NET compiler allows an entire class to be declared abstract, even though it does not contain any virtual abstract methods. See Class Types for more information.
    Like class fields and class properties , class static methods can be accessed without an object reference. Unlike Win32 Delphi class methods, class static methods have no Self parameter at all, and therefore cannot access any class members. Also unlike Win32 Delphi, class static methods cannot be declared virtual.
    Methods are made class static by appending the word static to their declaration
    Kan ik hier uit opmaken dat het helemaal niet mogelijk is om een singleton in combinatie met overerving te implementeren zoals ik dat wil?

  12. #12
    Hmm ik denk dat ik je eindelijk hebt begrepen ==> Je wilt eigenlijk de (abstract) factory pattern gaan implementeren in Delphi. Een mooi voorbeeldje in C# is dit:
    http://www.dofactory.com/Patterns/PatternFactory.aspx en overzicht van verschillende patterns

    Misschien kan je een mooie vertaling maken naar Delphi

  13. #13
    Volgens mij is het geen factory pattern, ik heb namelijk niet een class welke andere instansieert.

    Ik wil een abstracte database class, waarvan ik type databases laat overerven. Ik wil de abstracte class gebruiken als interface zeg maar. Later wordt dan bepaald welk type database er gebruikt wordt. Tevens wil ik hier het singleton-pattern voor gebruiken, er moet namelijk maar 1 instance van de database class.

  14. #14
    okee ik denk dat ik wel een voorbeeld code heb. Alleen is het C#. Ik zal die morgen ff in elkaar gooien en uppen.

    [watje modus]
    nu ff slapen morgen weer vroeg op
    [/watje modus]

  15. #15
    Hey jelmer,

    Ik heb vandaag ff naar gekeken, maar ik kwam weer uit op een factory pattern wat je niet wilde hebben Geen flauw idee waarom ik gisteravond zei, dat het kon Het is namelijk niet mogelijk om een abstract static functie te declareren in een abstract class. Zo is het namelijk gedefinieerd binnen .NET. Als je toch enige singleton manier wil gaan doen is die static methods eruit halen uit je abstract class en een soort singleton wrapper te schrijven om je database classes.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Clientdataset icm Dbgrid performance vraagje
    By Raymond in forum Databases
    Replies: 9
    Last Post: 31-Jan-05, 00:48
  2. Replies: 5
    Last Post: 25-Mar-03, 11:24
  3. MessageBeep of Beep icm Windows 2000
    By Richard in forum Algemeen
    Replies: 6
    Last Post: 22-Aug-02, 13:45
  4. TImage.Visible icm Mouse.Cursor
    By Richard in forum Algemeen
    Replies: 12
    Last Post: 26-Apr-02, 19:58
  5. OOD methodes
    By ernst in forum Algemeen
    Replies: 1
    Last Post: 09-Jan-02, 00:15

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •