• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Metoda MemberwiseClone()- dlaczego, aby jej użyć, muszę zaimplementować interfejs ICloneable?

Cloud VPS
0 głosów
738 wizyt
pytanie zadane 7 czerwca 2015 w C# przez Surykat Stary wyjadacz (14,780 p.)
Cześć. :) Cały dzień czytałem na temat płytkiego i głębokiego kopiowania, i zastanawia mnie jedna kwestia- wyczytałem, że jest metoda MemberwiseClone() ze specyfikatorem 'protected', zawarta w klasie Object. Tylko, skoro wszystko w C# dziedziczy z Object, to czy to 'wszystko' nie powinno mieć dostępu do tego? To byłoby trochę bez sensu, więc prosiłbym kogoś, by mi wyjaśnił, dlaczego tak jest. No i co do tego ma ten interfejs, który w sobie ma tylko deklaracje metody Clone(). Dzięki :)

1 odpowiedź

+1 głos
odpowiedź 7 czerwca 2015 przez niezalogowany
wybrane 7 czerwca 2015 przez Surykat
 
Najlepsza

"The ICloneable interface enables you to provide a customized implementation that creates a copy of an existing object."

Nie musisz implementować ICloneable. Interfejsu tego używasz tylko w sytuacji, kiedy potrzebujesz stworzyć metodę kopiowania "po swojemu" i wymusić na obiekcie jej posiadanie. Przykład z MSDN:

using System;

public class IdInfo
{
    public int IdNumber;

    public IdInfo(int IdNumber)
    {
        this.IdNumber = IdNumber;
    }
}

public class Person 
{
    public int Age;
    public string Name;
    public IdInfo IdInfo;

    public Person ShallowCopy()
    {
       return (Person)this.MemberwiseClone();
    }

    public Person DeepCopy()
    {
       Person other = (Person) this.MemberwiseClone(); 
       other.IdInfo = new IdInfo(this.IdInfo.IdNumber);
       return other;
    }
}

public class Example
{
    public static void Main()
    {
        // Create an instance of Person and assign values to its fields.
        Person p1 = new Person();
        p1.Age = 42;
        p1.Name = "Sam";
        p1.IdInfo = new IdInfo(6565);

        // Perform a shallow copy of p1 and assign it to p2.
        Person p2 = (Person) p1.ShallowCopy();

        // Display values of p1, p2
        Console.WriteLine("Original values of p1 and p2:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p2 instance values:");
        DisplayValues(p2);

        // Change the value of p1 properties and display the values of p1 and p2.
        p1.Age = 32;
        p1.Name = "Frank";
        p1.IdInfo.IdNumber = 7878;
        Console.WriteLine("\nValues of p1 and p2 after changes to p1:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p2 instance values:");
        DisplayValues(p2);

        // Make a deep copy of p1 and assign it to p3.
        Person p3 = p1.DeepCopy();
        // Change the members of the p1 class to new values to show the deep copy.
        p1.Name = "George";
        p1.Age = 39;
        p1.IdInfo.IdNumber = 8641;
        Console.WriteLine("\nValues of p1 and p3 after changes to p1:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p3 instance values:");
        DisplayValues(p3);
    }

    public static void DisplayValues(Person p)
    {
        Console.WriteLine("      Name: {0:s}, Age: {1:d}", p.Name, p.Age);
        Console.WriteLine("      Value: {0:d}", p.IdInfo.IdNumber);
    }
}
// The example displays the following output:
//       Original values of p1 and p2:
//          p1 instance values:
//             Name: Sam, Age: 42
//             Value: 6565
//          p2 instance values:
//             Name: Sam, Age: 42
//             Value: 6565
//       
//       Values of p1 and p2 after changes to p1:
//          p1 instance values:
//             Name: Frank, Age: 32
//             Value: 7878
//          p2 instance values:
//             Name: Sam, Age: 42
//             Value: 7878
//       
//       Values of p1 and p3 after changes to p1:
//          p1 instance values:
//             Name: George, Age: 39
//             Value: 8641
//          p3 instance values:
//             Name: Frank, Age: 32
//             Value: 7878

Object.MemberwiseClone, ICloneable

komentarz 7 czerwca 2015 przez Surykat Stary wyjadacz (14,780 p.)
Kurcze, teraz do mnie dotarło, dlaczego mi to nie działało, próbowałem wywołać tą metodę na rzecz obiektu w klasie Program... Wewnątrz klasy bazowej obiektu działa tak, jak oczekiwałem ;) Dzięki.

Podobne pytania

0 głosów
0 odpowiedzi 806 wizyt
0 głosów
1 odpowiedź 736 wizyt
pytanie zadane 26 marca 2021 w C i C++ przez Mavimix Dyskutant (8,420 p.)
+1 głos
1 odpowiedź 187 wizyt
pytanie zadane 10 sierpnia 2019 w JavaScript przez wsnofi Bywalec (2,680 p.)

93,483 zapytań

142,416 odpowiedzi

322,762 komentarzy

62,895 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...