Wzorzec Prototype

0

Witam!
Otóż staram się "rozpracować" wzorzec Prototype. Wygooglowałem taką stronę http://ashishkhandelwal.arkutil.com/?p=1089 i testuję... Napisałem taki oto programik w C# i chyba coś nie pasuje:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication11
{
    abstract class Prototype : ICloneable
    {
        // cloning the prototype into a new instance
        public abstract object Clone();
        // some usefull action
        public abstract void Action();
    }

    class Dziecko : Prototype
    {
        public string imie;
        public string urodziny;
        public Cechy cechy;
        public Dziecko(string _urodziny)
        {
            urodziny = _urodziny;
        }

        public override object Clone()
        {
            return this.MemberwiseClone();
        }
        public override void Action()
        {
            Console.WriteLine("\nImie: "+imie+"\nUrodziny: "+urodziny);
            cechy.Action();
        }
    }

    class Cechy : Prototype
    {
        public string cecha;
        public Cechy(string _cecha)
        {
            cecha = _cecha;
        }

        public override object Clone()
        {
            return this.MemberwiseClone();
        }
        public override void Action()
        {
            Console.WriteLine("Cecha: "+cecha);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Dziecko ob1 = new Dziecko("11 stycznia");
            ob1.cechy = new Cechy("Uczulony na mleko");
            Dziecko ob2 = (Dziecko)ob1.Clone();
            ob1.imie = "Tom";
            ob2.imie = "Bob";
            //ob1.cechy = new Cechy("Uczulona na pyłki");
            ob1.Action();
            Console.WriteLine("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
            ob2.Action();
            Console.ReadKey();
        }
    }
}

Jeśli dobrze zrozumiałem podany przeze mnie link, to obiekt "Cecha" nie powinien być sklonowany, a jednak jest... Czy może jednak ja jestem w błędzie?

0

a nie łatwiej na wiki
http://pl.wikipedia.org/wiki/Prototyp_(wzorzec_projektowy)
i nawet masz przykłady
http://pl.wikisource.org/wiki/Prototyp_(wzorzec_projektowy)/kod

MemberwiseClone robi kopię płytką.Więc klonując obiekt typu Dziecko, kopiujesz wartości imie, urodziny i referencję cechy.
Wzorzec prototyp powinien wykonywać kopię obiektu, czyli wg mnie powinna być to kopia głęboka.
Twój kod jest ok, tylko ty spodziewałeś się złego wyniku. Tak cecha sie nie klonuje, tylko pole cecha w obu obiektach dziecko to referencja do tego samego obiektu. Więc jeśli w od2 zmienisz właściwości pola cechy to ta zmiana będzie "widoczna" w ob1. Jeśli (jak zakomentowana linijka) do pola cechy w ob1 lub ob2 przypiszesz nowy obiekt to zmienisz referencję tylko w tym konkretnym obiekcie, w drugim obiekcie dziecko nie zostanie ona zmieniona.

Zostaw na razie wzorce i poczytaj o reference type i value type i obiektach typu immutable. Poza tym jeszcze słowo kluczowe ref i out. Zapoznaj się z różnicami w przekazywaniu przez wartość a referencję.

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