W jaki sposób definiować metodę Clone

0

Mam obiekt pewnej klasy i chce zaimplementować w nim metodę Clone która kopiuje wszystkie property z jednego obiektu do drugiego. Teraz widzę trzy podstawowe sposoby:

 
//1:
Class Klasa
{
	public void Clone(Klasa source)
	{
		this.prop1 = source.prop1;
		this.prop2 = source.prop2;
	}
}

//2:
Class Klasa
{
	public void Clone(Klasa target)
	{
		target.prop1 = this.prop1;
		target.prop2 = this.prop2;
	}
}


//3:
Class Klasa
{
	public static void Clone(Klasa source, Klasa target)
	{
		target.prop1 = source.prop1;
		target.prop2 = source.prop2;
	}
}

Wywołania oczywiście:

1: Target.Clone(Source)
2: Source.Clone(Target)
3: Klasa.Clone(Source, Target) 

Który sposób jest najbardziej przejrzysty i właściwy?

0

Moja propozycja nr 4

Class Klasa
{
   public Klasa Clone()
   {
      Klasa k = new Klasa();
      k.prop1 = this.prop1;
      k.prop2 = this.prop2;
      return k;
   }
}
0

W C# jest interfejs ICloneable.

0

Co ten wątek robi w tym dziale? o.O

Wibowit napisał(a)

W C# jest interfejs ICloneable.

Ano jest, z jedną bezparametrową metodą, która zwraca object i na dodatek trzeba ją zaimplementować samemu. ;)

Najpierw należy się zastanowić czy chce się zrobić kopię płytką czy głęboką, czy może jeszcze jakąś inną. A ponadto, czy mamy zamiar poprawiać metodę po każdej zmianie w definicji klasy.

0
Sarrus napisał(a)

Moja propozycja nr 4

Class Klasa
{
   public Klasa Clone()
   {
      Klasa k = new Klasa();
      k.prop1 = this.prop1;
      k.prop2 = this.prop2;
      return k;
   }
}

Oczywiście to nie wchodzi w grę. Jak łatwo zauważyć moje podane trzy sposoby są równoważne a różnią się tym że jednemu pasuje bardziej taki a innemu taki styl. Twoja metoda robi coś innego bo podmienia obiekt.
Chcę zrobić kopię płytką. Chcę kopiować jedynie typy proste. Nie ruszam obiektów referencyjnych. Czy da się to zrobić w ten sposób że nie ruszam metody kopiującej po zmianie struktury klasy? Ja tego nie potrafię.

Temat w takim dziale bo chodzi o wybór stylu :)

0
człowiek z żelastwa napisał(a)

Oczywiście to nie wchodzi w grę. Jak łatwo zauważyć moje podane trzy sposoby są równoważne a różnią się tym że jednemu pasuje bardziej taki a innemu taki styl. Twoja metoda robi coś innego bo podmienia obiekt.

Co robi? Jaki niby obiekt podmienia? To co zaprezentował Sarrus jest sensownym sposobem - utworzenie nowego obiektu i ustawienie mu właściwości.
Zaś Twoje metody są tragiczne - zamiast zwrócić wynik operacji, operują na swoich argumentach, tak się nie programuje.

Chcę zrobić kopię płytką. Chcę kopiować jedynie typy proste. Nie ruszam obiektów referencyjnych. Czy da się to zrobić w ten sposób że nie ruszam metody kopiującej po zmianie struktury klasy? Ja tego nie potrafię.

Więc zrób to po ludzku - niech Twoja klasa implementuje ICloneable, a w metodzie Clone użyj po prostu MemberwiseClone: http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx

0

@somekind:
Ale moje wszystkie metody robią jedną rzecz na różne sposoby i tą rzecz chcę zrobić, czwarta metoda robi coś innego. Dajmy na to że mam złożony obiekt który zawiera w sobie obiekty, kolekcje i zmienne proste (string, int, double enumy itd). Chcę żeby moja metoda Clone operowała tylko na typach prostych. Podaję jej obiekt w którym pewne obiekty składowe, kolekcje są wypełnione i nie chcę ich stracić. Dlatego moje sposoby mi odpowiadają a czwarty nie.

0

To jak należy rozumieć to zdanie?

człowiek z żelaza napisał(a)

Mam obiekt pewnej klasy i chce zaimplementować w nim metodę Clone która kopiuje wszystkie property z jednego obiektu do drugiego.

Bo wszystkie to nie są wszystkie typów prostych.

Teraz jak rozumiem, to Ty nie chcesz metody Clone lecz UpdateExistingObjectWithSomeValuesFromAnotherExistingObject. ;)

0
somekind napisał(a)

To jak należy rozumieć to zdanie?

człowiek z żelaza napisał(a)

Mam obiekt pewnej klasy i chce zaimplementować w nim metodę Clone która kopiuje wszystkie property z jednego obiektu do drugiego.

Bo wszystkie to nie są wszystkie typów prostych.

Teraz jak rozumiem, to Ty nie chcesz metody Clone lecz UpdateExistingObjectWithSomeValuesFromAnotherExistingObject. ;)

Dokładnie :)

0

Czy da się to zrobić w ten sposób że nie ruszam metody kopiującej po zmianie struktury klasy?

Da się to zrobić

Type type = this.GetType();

Type posiada takie metody jak GetProperties(), GetFields() i właściwość IsPrimitive. Ogólnie wszystko czego dusza zapragnie. Możesz potrzebować dodać przestrzeń System.Reflection.

1 użytkowników online, w tym zalogowanych: 0, gości: 1