Toon posts:

[vb.net] Kopieren van een instance van een class

Pagina: 1
Acties:
  • 75 views sinds 30-01-2008

Verwijderd

Topicstarter
Hoi,

Hoe kun je in vb.net 2003 een instance van een iegengemaakte kopieren zodat je dus twee keer een instance krijgt met de zelfde eigenschappen.

P.S. Je helpt me ook als je me kan uitleggen hoe je met het clipboard kunt werken met eigen geschreven klassen als data

Groeten, Buttie

  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
Kijk eens naar de ICloneable interface.
Door je object te clonen, kan je dus een 2de, identieke instance hebben van het geclonede object.
Die interface moet je natuurlijk zelf wel implementeren.
Een manier om een 'clone' te maken, is om jouw object te serializeren naar een memorystream, en dan die memory-stream opnieuw te unserializen naar een instance van diezelfde class; die return je dan et voila.

Hoe je met het clipboard kunt werken ? Kijk eens naar de Clipboard class:
In de help staat er, dat jouw class de IDataObject moet implementeren, wil je die ondersteuning kunnen bieden. De class moet ook serializable zijn.

Heb je trouwens zelf al iets geprobeerd ? Zoja, wat ?

ps: je hoeft geen groeten te doen in je post. ;)

[ Voor 9% gewijzigd door whoami op 08-09-2005 22:19 ]

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 30-04 15:39

pjvandesande

GC.Collect(head);

Verwijderd schreef op donderdag 08 september 2005 @ 22:08:
Hoi,

Hoe kun je in vb.net 2003 een instance van een iegengemaakte kopieren zodat je dus twee keer een instance krijgt met de zelfde eigenschappen.
Ik maak meestal gebruik van een private constructor:

C#:
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
public class Melp : ICloneable
{
    private string _myString;
    private int _myInt;


    public Melp()
    {
    }

    // Clone ctor
    private Melp( Melp melp )
    {
        // Clone _myString
        _myString = (string)melp._myString.Clone();

        // _myInt hoeft niet gecloned te worden, is namelijk een value type
        _myInt = melp._myInt;
    }

    public object Clone()
    {
        return new Melp( this );
    }
}
P.S. Je helpt me ook als je me kan uitleggen hoe je met het clipboard kunt werken met eigen geschreven klassen als data.
Voor het werken met de Clipboard class kun je hier, als je je eigen data type in het Clipboard wil kunnen zetten moet je zoals whoami al aangeeft de IDataObject interface implementeren.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 27-04 18:17

gorgi_19

Kruimeltjes zijn weer op :9

questa: Waarom gebruik je niet MemberwiseClone-method in je Clone-method?

[ Voor 23% gewijzigd door gorgi_19 op 09-09-2005 08:17 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
questa: Waarom gebruik je niet MemberwiseClone-method in je Clone-method?
Werkt dit ook als je class members heeft van een custom type ?

[ Voor 77% gewijzigd door whoami op 09-09-2005 09:03 ]

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
questa schreef op vrijdag 09 september 2005 @ 07:48:
C#:
1
2
3
4
5
6
7
8
9
// Clone ctor
private Melp( Melp melp )
{
    // Clone _myString
    _myString = (string)melp._myString.Clone();

    // _myInt hoeft niet gecloned te worden, is namelijk een value type
    _myInt = melp._myInt;
}
Waarom doe je bij een string wel Clone en bij je Int niet? Een string is immutable dus hoef je ook niet te clonen lijkt mij.

[ Voor 3% gewijzigd door Woy op 09-09-2005 09:35 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
questa: ik vind jouw oplossing wel een beetje 'gevaarlijk'.
Als er een member bijkomt in jouw class, dan mag je al niet vergeten dat je die constructor ook moet aanpassen.

Het idee v/d memberwiseclone van gorgio en de manier waarbij je het object serialized/deserialized (al moeten die classes dan wel serializable zijn) vind ik daarom een betere oplossing.

https://fgheysels.github.io/


  • guanpedro
  • Registratie: Maart 2002
  • Laatst online: 18-12-2025

guanpedro

Live forever or die trying

Zoals Whoami al zei, je zou het object ook kunnen serializen en de-serializen:

code:
1
2
3
4
5
6
7
8
9
10
public TestClass Copy()
{
  MemoryStream memoryStream = new MemoryStream();
  BinaryFormatter binaryFormatter = new BinaryFormatter();
  
  binaryFormatter.Serialize(memoryStream, this);
  memoryStream.Seek(0, SeekOrigin.Begin);

  return (TestClass)binaryFormatter.Deserialize(memoryStream);
}


Voordeel: snel te implementeren, generiek
Nadeel: Alles moet serializable zijn

http://www.codeproject.com/dotnet/Clone.asp
http://www.ondotnet.com/pub/a/dotnet/2002/11/25/copying.html

EDIT: Credits go to Whoami

[ Voor 10% gewijzigd door guanpedro op 09-09-2005 09:51 ]

PC: MSI-NEO2FISR P4-2.6HT@2.8 Dual-channel GEIL-PC3500 Intel CSA GB-LAN 9600PRO Pioneer DVR106 Server: Dual Xeon-2GHz 3Ware 7500-12 11x120GB RAID5 GB-LAN RH 9 2.4.22 Digicam: Sony DSC-F717


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
guanpedro schreef op vrijdag 09 september 2005 @ 09:49:
Je zou het object ook kunnen serializen en de-serializen maar dan moet het object serializable zijn.
Ja, wat ik dus al in m'n eerste reply aangedragen heb.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 30-04 15:39

pjvandesande

GC.Collect(head);

whoami schreef op vrijdag 09 september 2005 @ 09:39:
questa: ik vind jouw oplossing wel een beetje 'gevaarlijk'.
Als er een member bijkomt in jouw class, dan mag je al niet vergeten dat je die constructor ook moet aanpassen.

Het idee v/d memberwiseclone van gorgio en de manier waarbij je het object serialized/deserialized (al moeten die classes dan wel serializable zijn) vind ik daarom een betere oplossing.
Eensch.

Hoewel je dit met MemberWiseClone ook houd dacht ik, want je houd wel het probleem met deep-copying wat je met serialized/deserialized niet hebt.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07:46
questa schreef op vrijdag 09 september 2005 @ 10:22:
Hoewel je dit met MemberWiseClone ook houd dacht ik, want je houd wel het probleem met deep-copying wat je met serialized/deserialized niet hebt.
Je moet van alle objecten dan ook zorgen dat ze te serializen zijn idd, voordeel is wel dat je hier dan een compiler bericht op krijgt en bij jouw methode niet. :)

Ander punt lijkt me de performance. Weet niet hoe zo'n memorystream werkt, maar lijkt me onvoordelig om een object met integers te kopieren/clonen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
farlane schreef op vrijdag 09 september 2005 @ 12:36:
[...]


Je moet van alle objecten dan ook zorgen dat ze te serializen zijn idd, voordeel is wel dat je hier dan een compiler bericht op krijgt en bij jouw methode niet. :)
Ik geloof niet dat je at - compile time daar een error op gaat krijgen....

https://fgheysels.github.io/


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07:46
Hmm, je hebt gelijk. Meende dat ik @compile time een melding daarvan gekregen had maar ik ben abuis.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Ik heb nu de volgende code

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        ElseIf sender.Index = 1 Then 'Copy
            Dim s As NetworkComponent = CType(sender.parent.SourceControl, NetworkComponent)

            Dim test As New NetworkComponent("Hello, this is a test.")
            Dim testFormat As DataFormats.Format = DataFormats.GetFormat("NC")
            Dim dataObj As New DataObject
            dataObj.SetData(testFormat.Name, False, test)
            Clipboard.SetDataObject(dataObj)

        ElseIf sender.Index = 2 Then 'Paste
            sender = CType(sender.parent.SourceControl, NetworkComponent)

            Dim dataObj As DataObject = Clipboard.GetDataObject()
            Dim testFormat As DataFormats.Format = DataFormats.GetFormat("NC")
            If dataObj.GetDataPresent(testFormat.Name, False) Then
                Dim nc As NetworkComponent = CType(dataObj.GetData(testFormat.Name),  NetworkComponent)
                MsgBox(nc.Text)
                nc.Location = New Point(sender.location.x - 10, sender.location.y - 10)
                Tab.Controls.Add(nc)
            Else
                MsgBox("No data present")
            End If
        End If


de network class is serializable

het werkt nog niet want hij geeft voor nc een nullpointerex

nc = nothing

Weet iemand meer ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
nc == nothing ?
En dan ben je verwonderd dat je een nullpointerexception krijgt als je die nc aanroept ?

Da's toch logisch ? Ga eens na wat een nullpointer-exception is.

Wat jij moet doen, is je code debuggen, nagaan waarom 'nc' null is, en het oplossen.
Het is niet de bedoeling dat wij dat voor jou doen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Neej duhhhh ik ben niet verbaast dat er een nullpointer komt
maar weet niet waarom nc null en heb namelijk weinig tijd dus hoopte dat iemand het antwoord wist

  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
Jij hebt wenig tijd, dus ga je er maar vanuit dat er iemand anders is die wel veel tijd heeft, en die code even voor jou debugged ?
Sorry, maar zo werkt het hier niet.

Het is niet de bedoeling dat anderen jouw code gaan debuggen, ook al heb je weinig tijd. Als je het werkend wilt krijgen, dan zal je er tijd moeten insteken.

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.