przekazanie wartosci z obiektu do 2 innych klas

0

Czy istnieje możliwość przekazania jednego i tego samego obiektu klasy do dwóch innych klas? Jak poprawnie obiektowo spowodować, aby metoda metodaA() i metodaB() miały ta sama wartość zwróconą przez podaj_liczbe()

public class ZRODLO
    {
        public int podaj_liczbe()
        {
            Random r = new Random();
            return r.Next(1000); //dostaje 333
        }
     

    }
    public class A
    {
        public void metodaA()
        {
            ZRODLO z = new ZRODLO();
            int a = z.podaj_liczbe();  //tu chce 333
        }
    }

    public class B
    {
        public void metodaB()
        {
            ZRODLO z = new ZRODLO();
            int a = z.podaj_liczbe(); //tu chce tez 333
        }
    }

Proszę o sugestie ...

0

Random losuje liczbę co wywołanie.

Więc możesz 1: przypisać gdzieś wylosowaną liczbę i z innych metod ją zwrócić.
2: Było by trzeba zastosować dziedziczenie i jako zwracaną wartość przesyłać wynik losowania z klasy bazowej;p

// Klasa bazowa
// metoda
return r.next(x);

// klasa potomna
// Metoda A
return base.MetodaLosująca();

// I tak samo do 3 klasy
#region O takie coś
using System;

class A
{
    public int a()
    {
        Random random = new Random();
        return random.Next(1000);
    }
}
class B : A
{
    public int b()
    {
        return base.a();
    }
}
class C : B
{
     public int c()
    {
        return base.b();
    }
}


class App
{
    static void Main()
    {
        A a = new C();
        Console.WriteLine(a.a());
        Console.ReadLine()  ;
    }
}
#endregion
 
0

Dziękuję za odpowiedź, jednak z jakiegoś powodu metody zwracają mi 3 różne wartości. Czy popełniam błąd w kodzie?

       static void Main(string[] args)
        {
            A a = new C();
            a.metodaA();
            B b = new C();
            b.metodaB();
            C c = new C();
            c.metodaC();
            Console.ReadLine();

        }
    }
    public class ZRODLO
    {      
        public int podaj_liczbe()
        {
            Random r = new Random();
            return r.Next(1000); 
        }
     }

    public class A : ZRODLO
    {
        public void metodaA()
        {
         Console.WriteLine(base.podaj_liczbe());
        }
    }

    public class B : A
    {
        public void metodaB()
        {
            base.metodaA();
        }
    }

    public class C : B
    {
        public void metodaC()
        {
            base.metodaB();
        }
    }
0

Żadne dziedziczenie - dziedziczenie to relacja: jest typu.

class Source
{
	private int number;
	private Random rand;

	public Source()
	{
		generate();
	}

	public int generate()
	{
		number = rand.Next(1000);
		return number;
	}

	public int Number
	{
		get {return number;}
	}
}

class A
{
	private Source source;

	public A(Source source)
	{
		this.source = source;
	}

	public int getFromA()
	{
		return source.Number;
	}
}

class B
{
	private Source source;

	public B(Source source)
	{
		this.source = source;
	}

	public int getFromB()
	{
		return source.Number;
	}
}

a w main:

Source s = new Source();
A a = new A(s);
B b = new B(s);

Console.WriteLine(a.getFromA());
Console.WriteLine(a.getFromB());
0

Dziękuję byku_guzio za pomoc.
Cały czas męczy mnie jednak pytanie czy istnieje jakikolwiek sposób aby to klasy A i B pobierały ta sama wartość ze źródła.
Zakładam, ze problem nie jest taki prosty ze istnieje main które wszystkie klasy spina. Instancje klas A i B są wywoływane w różnych miejscach.

0

jest takie cosik jak 'Singleton'


    public class A
    {
        public void metodaA()
        {
            ZRODLO z = ZRODLO.Instance;
            int a = z.podaj_liczbe();  //tu chce 333
        }
    }

    public class B
    {
        public void metodaB()
        {
            ZRODLO z = ZRODLO.Instance;
            int a = z.podaj_liczbe();  //tu chce 333
        }
    }


     public class ZRODLO // Singleton
    {
        private static ZRODLO instance;
        private int x;
        private ZRODLO() 
        {
            Random r = new Random();
            x = r.Next(1000);  
        }       
        public static ZRODLO Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new ZRODLO();

                }
                return instance;
            }
        }
        public int podaj_liczbe()
        {                        
                return x;            
        }
    }

Działa :-)

PS: To jest mój pierwszy post na tym forum, dziwi mnie fakt że ten post znalazł się pomiędzy dwoma starszymi postami, jak to jest ??

0

Sprytne rozwiązanie noHumanek, ale z tego co wiem Singleton spowoduje, ze 2 instancje klasy A nie będą mogły wygenerować swoich random liczb w tym samym czasie, a jest to istotne.

Poszukuję następującego rozwiązania: istnieją instancje klasy A i B (docelowo n), każda para chce mieć ta sama wygenerowana liczbę random, ale nie mam gwarancji ze każda z nich w każdym wywołaniu aplikacji będzie miała instancje.

0

Więc musisz mieć klasę pomocniczą, która wywoła Zrodlo.PodajLiczbe(), zapamięta sobie wynik w jakiejś zmiennej, a potem przekaże do obiektów lub metod klas A i B.

W ogóle śmierdzi tu jakimś błędem projektowym, co Ty właściwie kombinujesz? Bo na 99% da się to zrealizować inaczej.

0

Dla każdego klienta potrzebuje jedno ID (tu ten random number). Ale chce je wygenerować w momencie utworzenia pierwszej instancji klasy ZRODLO przez inna klasę (np.A). B ma dostać to samo ID. Moze faktycznie za dożo kombinuje.

0

To klasa A nie może przekazać ID, które dostała do klasy B?

0

słaby jestem z teorii obiektowości ale napisz coś więcej na temat tego co chcesz zrobić

  1. tworzysz pary instancji a i b jednocześnie ?
  2. tworzysz tu trochę 'a' tam trochę 'b' i czasem może być więcej instancji a czasem więcej instancji b ?

normalnie to się przekazuje [referencje] do obiektu(obiekty zawsze przekazują się przez referencje) ZRODLO przy tworzeniu każdej pary

       static void Main(string[] args)
        {
            ZRODLO z = new ZRODLO();
            A aa = new A(z);
            aa.metodaA();

            B bb = new B(z);
            bb.metodaB();
        }

    public class A
    {
        private ZRODLO wew_zrodlo;
        public A( ZRODLO z)
        {
            wew_zrodlo = z;
        }
        public void metodaA()
        {            
            int a = wew_zrodlo.podaj_liczbe(); 
        }
    }

    public class B
    {
        private ZRODLO wew_zrodlo;
        public B( ZRODLO z)
        {
            wew_zrodlo = z;
        }
        public void metodaB()
        {
            int a = wew_zrodlo.podaj_liczbe();  
        }
    }



    public class ZRODLO
    {
        private int x;
        public  ZRODLO()
        {
            Random r = new Random();
            x= r.Next(1000); 
        }

        public int podaj_liczbe()
        {
            return x;
        }

    }
 
0

Po głębszym zastanowieniu rozwiązanie z singletonem jest tym czego szukam.
Dziękuję wszystkim za pomoc, ja nadal się uczę dlatego każda wypowiedź jest dla mnie cenna.

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