• 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?

Hosting forpsi easy 1 pln
0 głosów
654 wizyt
pytanie zadane 7 czerwca 2015 w C# przez Surykat Stary wyjadacz (14,760 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,760 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 375 wizyt
0 głosów
1 odpowiedź 356 wizyt
pytanie zadane 26 marca 2021 w C i C++ przez Mavimix Dyskutant (8,390 p.)
+1 głos
1 odpowiedź 124 wizyt
pytanie zadane 10 sierpnia 2019 w JavaScript przez wsnofi Bywalec (2,660 p.)

92,083 zapytań

140,741 odpowiedzi

317,701 komentarzy

61,405 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia w koszyku, uzyskując rabat aż -50% (w dniach 24.11 - 29.11 z okazji Black Friday, a potem będzie to -30%) na bilety w wersji "Standard"! Więcej informacji na temat akademii znajdziecie tutaj. Dziękujemy Sekurakowi za tak fajną zniżkę dla Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 15% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...