Costruttori che chiamano costruttori

di il
8 risposte

Costruttori che chiamano costruttori

Salve a ben trovati!
Sono abbastanza nuovo nel C#, e ho problemi a trovare le seguenti informazioni nella documentazione.
Per supportare la domanda, creo un esempio di creazione di una classe Rettangoli e chiamata tra costruttori:

class Rettangoli
	{
		private int Altezza;
		private int Larghezza;
		
		private Rettangoli(int A, int L) //costruttore con parametri
		{
			this.Altezza=A;
			this.Larghezza=L;
		}
		
		private Rettangoli():this(100,100) // assegno dei valori noti a priori
		{
		}
	}
Fin qui tutto bene, ma quando suppongo di voler chiamare il costruttore Rettangoli con parametri dal costruttore senza parametri, volendo specificare numeri casuali per i parametri non so come fare...
Per intenderci, non posso fare come qui di seguito perchè ottengo un errore a design time:

class Rettangoli
	{
		private int Altezza;
		private int Larghezza;
		
		
		private Rettangoli(int A, int L) //costruttore con parametri
		{
			this.Altezza=A;
			this.Larghezza=L;
		}
		
		private Rettangoli() // costruttore senza parametri
		{
			Random R = new Random();
			int A, L;
			
			A=R.Next(100);
			L=R.Next(100);
			Rettangoli(A,L);	// questo mi crea errore...
		}
	}
Sapreste indirizzarmi verso la soluzione?
Grazie infinite!

8 Risposte

  • Re: Costruttori che chiamano costruttori

    Non con il costruttore ...
    
            private void SetPar(int A, int L)
            {
                this.Altezza = A;
                this.Larghezza = L;
            }
    
            public Rettangoli(int A, int L) //costruttore con parametri
            {
                SetPar(A, L);
            }
    
            public Rettangoli() // costruttore senza parametri
            {
                Random R = new Random();
                int A, L;
    
                A = R.Next(100);
                L = R.Next(100);
                SetPar(A, L);
            }
    
    e i costruttori devono essere public
  • Re: Costruttori che chiamano costruttori

    Riguardo ai costruttori privati puoi leggere questo https://docs.microsoft.com/it-it/dotnet/csharp/programming-guide/classes-and-structs/private-constructors ,ciao
  • Re: Costruttori che chiamano costruttori

    [messaggio eliminato] Scusate, mi ero dimenticato di quotare e ho creato un altro messaggio di risposta con il quoting...
  • Re: Costruttori che chiamano costruttori

    surfernet ha scritto:


    Riguardo ai costruttori privati puoi leggere questo https://docs.microsoft.com/it-it/dotnet/csharp/programming-guide/classes-and-structs/private-constructors ,ciao
    Già provato... Non c'è niente a riguardo, purtroppo...
  • Re: Costruttori che chiamano costruttori

    oregon ha scritto:


    Non con il costruttore ...
    
            private void SetPar(int A, int L)
            {
                this.Altezza = A;
                this.Larghezza = L;
            }
    
            public Rettangoli(int A, int L) //costruttore con parametri
            {
                SetPar(A, L);
            }
    
            public Rettangoli() // costruttore senza parametri
            {
                Random R = new Random();
                int A, L;
    
                A = R.Next(100);
                L = R.Next(100);
                SetPar(A, L);
            }
    
    e i costruttori devono essere public
    Ah ok, è una soluzione...
    Tali problemi sono oggetto di un corso che sto seguendo, i cui esercizi però fanno riferimento alla chiamata diretta del costruttore con parametri...
    Intanto grazie comunque, ma immaginavo che esistesse un modo per chiamare direttamente il costruttore con i parametri. Almeno negli esercizi si intende questo...
  • Re: Costruttori che chiamano costruttori

    Quando istanzi un oggetto lo puoi chiamare ma non nella classe
  • Re: Costruttori che chiamano costruttori

    oregon ha scritto:


    Quando istanzi un oggetto lo puoi chiamare ma non nella classe

    Vi indico il testo degli esercizi:

    1)Dichiarare un oggetto chiamato treno con:
    - attributi privati interi: Classe, Posti a sedere, Posti in piedi
    - un costruttore pubblico che accetta come parametro tutti gli attributi.

    2)Dichiarare nell'oggetto un costruttore pubblico senza parametri che chiama il precedente costruttore per creare un Oggetto Treno, assegnando valori casuali tra 1 e 2 per Classe, tra 200 e 250 per Posti a sedere, 100 e 150 per Posti in piedi.

    Leggendo ora il quesito 2, mi sembra che intenda il costruttore che crea l'istanza dell'oggetto nel corpo del programma, e non il costruttore interno della classe...

    Ma in questo caso come passerei dei valori casuali agli attributi privati dell'oggetto?
  • Re: Costruttori che chiamano costruttori

    Fulcro ha scritto:


    Dichiarare nell'oggetto un costruttore pubblico senza parametri che chiama il precedente costruttore per creare un Oggetto Treno, assegnando valori casuali tra 1 e 2 per Classe, tra 200 e 250 per Posti a sedere, 100 e 150 per Posti in piedi.
    [...]
    Ma in questo caso come passerei dei valori casuali agli attributi privati dell'oggetto?
    Applicando l'esercizio alla lettera, dovresti invocare il costruttore con tutti i parametri usando la parola chiave this.

    Anche se preferisco le soluzioni che ti sono già state suggerite, nella dichiarazione del costruttore ricorda che puoi sempre invocare metodi statici, magari privati, che ti restituiscono un valore iniziale da memorizzare negli attributi passandoli all'altro costruttore.

    Ad esempio, puoi scrivere qualcosa di questo tipo:
    
    public class Treno
    {
    	private int _classe;
    	private int _postiASedere;
    	private int _postiInPiedi;
    	
    	public Treno(int classe, int postiASedere, int postiInPiedi)
    	{
    		_classe = classe;
    		_postiASedere = postiASedere;
    		_postiInPiedi = postiInPiedi;
    	}
    	
    	public Treno()
    		: this(GetRandomClasse(), GetRandomPosti(), GetRandomPosti())
    	{
    	}
    	
    	private static int GetRandomClasse()
    	{
    		return new Random().Next(1, 2);
    	}
    
    	private static int GetRandomPosti()
    	{
    		return new Random().Next(1, 100);
    	}
    }
    
    Ciao!
Devi accedere o registrarti per scrivere nel forum
8 risposte