Wykonywanie operacji na bieżącym obiekcie, zapis bieżącego obiektu itp.

0

Witam,

Pytanie dotyczy możliwości np. zapisania stanu bieżącego obiektu, dajmy na to bardzo prosty obiekt (tylko dla przykładu):

public class MojObiekt
    {
        private int a;
        private int b;
        private int c;

        public int wynikMnozenia { get; private set; }
        public int wynikDodawania { get; private set; }

        public MojObiekt()
        {
            a = 1;
            b = 1;
            c = 1;
        }

        public MojObiekt(int a, int b, int c)
        {
            this.a = a;
            this.b = b;
            this.c = c;
        }

        public int Pomnoz()
        {
            wynikMnozenia = a * b * c;
            return a * b * c;
        }

        public int Dodaj()
        {
            wynikDodawania = a + b + c;
            return a + b + c;
        }

        public void Zapisz(string SciezkaPliku)
        {
            // kod odpowiedzialny za zapis np do pliku bieżącego stanu publicznych zmiennych 
            // wynikMnozenia i wynikDodawania
        }
    }

Teraz chciałbym osiągnąć taki efekt, inicjuje sobie nowy obiekt, w konstruktorze mogę podać zmienne, potem wywołać metody dodawania i mnożenia a na końcu chciałbym za pomocą wywołania metody "Zapisz". Dla przykładu:

class Program
    {
        static void Main(string[] args)
        {
            MojObiekt mo = new MojObiekt(1, 2, 3);
            mo.Pomnoz();
            mo.Dodaj();

            //I TU DOKŁĄDNIE CHODZI MI O TO ABY PO WYWOŁANIU PONIŻSZEJ METODY ZAPISAŁO MI LUB PRZETWORZYŁO W INNY SPOSÓB BIEŻĄCY OBIEKT
            mo.Zapisz("plik.txt");
        }
    }

Oczywiście jest to tylko przykład, w rzeczywistości mam klasę która przechowuje wiele informacji i domyślnie chciałbym zapisywać jej stan do XML (serializować) wywołując metodę np. SaveToXML(string LokalizacjaPliku), bez wprowadzania dodatkowych (oprócz lokalizacji pliku) informacji, tak więc metoda miała by odwoływać się do bieżącego obiektu. Czy jest na to jakiś prosty sposób czy w metodzie musiałbym inicjować nowy obiekt i w taki sposób go zapisać? Dla przykładu:

...
 public void Zapisz(string SciezkaPliku)
        {
            MojObiekt mo = new MojObiekt(a, b, c);
            mo.Dodaj();
            mo.Pomnoz();

            StreamWriter sw = new StreamWriter(SciezkaPliku);
            sw.Write(mo);
            sw.Close();
        }

Tak więc czy jest jakaś prostsza metoda niż inicjowanie nowego obiektu i ponowne nadawanie mu parametrów tylko po to aby go zapisać?

Oczywiście jest jeszcze taka możliwość aby w metodzie zapisu jako argument przekazać ów obiekt, dla przykładu:

 public void Zapisz(string SciezkaPliku, MojObiekt o)
        {
            StreamWriter sw = new StreamWriter(SciezkaPliku);
            sw.Write(o);
            sw.Close();
        }
 

I podczas wywołania skorzystać w ten sposób:

 static void Main(string[] args)
        {
            MojObiekt mo = new MojObiekt(1, 2, 3);
            mo.Pomnoz();
            mo.Dodaj();

            //I TU DOKŁĄDNIE CHODZI MI O TO ABY PO WYWOŁANIU PONIŻSZEJ METODY ZAPISAŁO MI LUB PRZETWORZYŁO W INNY SPOSÓB BIEŻĄCY OBIEKT
            mo.Zapisz("plik.txt", mo);
        }

Pozdrawiam i czekam na konstruktywne wypowiedzi.

0
osamex napisał(a):

Tak więc czy jest jakaś prostsza metoda niż inicjowanie nowego obiektu i ponowne nadawanie mu parametrów tylko po to aby go zapisać?

Chodzi Ci o dostęp do aktualnego obiektu w jakiejś jego metodzie?
Możesz to zrobić przy użyciu słowa kluczowego this.

0

Nie chodzi mi o dostep do elementu obiektu (atrybuty czy pola klasy), wiem że słowo kluczowe "this" oznacza odwołanie się do bieżącego elementu klasy (w przykładzie nawet jest taka konstrukcja), chodzi o odwołanie do całego obiektu.

Znalazłem rozwiązanie jest nią metoda Object.MemberwiseClone opis na MSDN: http://msdn.microsoft.com/pl-pl/library/system.object.memberwiseclone.aspx

Na razie metodę tą testuję i chyba spełnia moje oczekiwania.

0

Przepraszam moje niedouczenie :( faktycznie this przecież wskazuje na bieżący obiekt dopiero po kropce na jego "elementy"

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