Odwołanie się do drugiej klasy C#

Nie za bardzo wiem jak dostosować swój kod patrząc na stronie który przysłałeś. Jeszcze mam błędny. Już nic tu nie wymyśle bez podpowiedzi.
Proszę podpowiedz co mam źle.

public Osoba(int numerEwidencyjny, string nazwisko, string imie, Adres adres)
       {
           this.numerEwidencyjny = numerEwidencyjny;
           this.nazwisko = nazwisko;
           this.imie = imie;
           this(adres)
       }

       
       public Osoba(int numerEwidencyjny, string imie,  Adres adres, int numerDomu) :       
       this(numerEwidencyjny, "Kowalski", imie, "02-222", "Warszawa", "Aleje Jerozolimskie",  numerDomu, 0)
       this.adres = Adres;
       { }

Nie mam pojęcia co robię źle. Podpowiedz proszę co jest źle , czego brakuje.

public Osoba(int numerEwidencyjny, string imie, int numerDomu) :
this(numerEwidencyjny, „Kowalski”, imie, new Address(„02-222”, „Warszawa”, „Aleje Jerozolimskie”, numerDomu, 0)) { }

https://dotnetfiddle.net/Widget/XpVgG7

The wszystko „ZwrocXYZ” są niepotrzebne.

Jeśli chcesz mieć pole które możesz ustawiać jedynie wewnątrz klasy, ale chcesz aby było dostępne z zewnątrz, to utwórz „property” { get; private set; }

https://dotnetfiddle.net/Widget/Q6xNnO

Wielkie dzięki nawet nie wiedziałam że można tak zrobić.
Mam problem z połączeniem wiedzy teoretycznej z praktyczną. Nie wiem jak sobie z tym poradzić.
No faktycznie chyba muszę już odpocząć bo umysł mi nie pracuje.

Ciężko inaczej. Nie miałaś konstruktora, który przyjmowałby podawane przez ciebie parametry. Skoro „chciał” Adres to musisz tam przekazać coś co jest Adresem.

Dobrze byłoby jakbyś podała też w jakim języku piszesz - ja zgadywałem, że Java dlatego pisałem o złej składni co było błędną podpowiedzią.

Jak napisałam na początku I postu nie mogę stosować get i set i nie mogę usunąć żadnych nazw (powinnam napisać nie mogę usunąć kodu i wymienić). Też nie mogę usunąć Zwróć… bo to ma zostać w kodzie.Tak zażyczył sobie wykładowca.

1 polubienie

O przepraszam faktycznie C#

„using” i „static void Main(string[] args)” w Javie? :wink:

Nie to C# klasa Program nie wolno mi zmieniać.

Zasady zadania

  • nie używaj get, set
  • nic nie zmieniaj w klasie Program
  • Pozostaw kod bez usuwania pól, konstruktorów, klas.

Zmień kod tak aby

  • była klasa Osoba, klasa Adres
  • Z klasy Osoba wyróżnij klasę Adres
  • dla utworzonej klasy adres zdefiniuj swoje konstruktory.
  • zastosuj kilka różnych konstruktorów

Do tego zadania wykładowca dał kod, który trzeba przerobić tak aby spełniał wymagania zadania
Klasa Osoba

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

namespace KadryStart 
{ 
    class Osoba 
    { 
            private string nazwisko; 
            private string imie; 
            private int numerEwidencyjny; 
            private string miejscowosc; 
            private string kod; 
            private string nazwaUlicy; 
            private int numerDomu; 
            private int numerMieszkania; 

            public Osoba(int numerEwidencyjny, string imie, string nazwisko, int numerDomu, int numerMieszkania, 
                    string nazwaUlicy, string kod, string miejscowosc) 
            { 
                this.numerEwidencyjny = numerEwidencyjny; 
                this.imie = imie; 
                this.nazwisko = nazwisko; 

                this.miejscowosc = miejscowosc; 
                this.kod = kod; 
                this.nazwaUlicy = nazwaUlicy; 
                this.numerDomu = numerDomu;
                this.numerMieszkania = numerMieszkania; 
            }

public Osoba(int numerEwidencyjny, string imie, int numerDomu) : 
this(numerEwidencyjny, imie, "Kowalski", numerDomu, 0, "Aleje Jerozolimskie", "02-
222", "Warszawa") { } 

public Osoba(ref Osoba osoba) 
            { 
                numerEwidencyjny = osoba.numerEwidencyjny; imie = osoba.imie; nazwisko 
= osoba.nazwisko; miejscowosc = osoba.miejscowosc; 
                kod = osoba.kod; nazwaUlicy = osoba.nazwaUlicy; numerDomu = 
osoba.numerDomu; numerMieszkania = osoba.numerMieszkania; 
            } 

public string ZwrocInformacjeOsobowe() 
            { 
                return string.Format("\n Pan(i) {0} {1} o numerze ewidencyjnym: {2} zamieszkały(a): {3} {4} {5}", 
                imie, nazwisko, numerEwidencyjny, ZwrocMiejscowosc(), 
                ZwrocKod(), ZwrocNazweUlicy() + " " + ZwrocNumerDomu() + " m" + ZwrocNumerMieszkania()); 
            }

            public string ZwrocMiejscowosc() { return miejscowosc; } 

            public string ZwrocNazweUlicy() { return nazwaUlicy; } 

            public string ZwrocKod() { return kod; } 

            public int ZwrocNumerDomu() { return numerDomu; } 

            public int ZwrocNumerMieszkania() { return numerMieszkania; 
} 

            public void ZmienDaneOsobowe() 
            { 
                Console.Write("Podaj imię: "); imie = Console.ReadLine(); 
                Console.Write("Podaj nazwisko: "); nazwisko = Console.ReadLine(); 
                do 
                { 
                    Console.Write("Podaj numer ewidencyjny: "); 
                } 
                while (!int.TryParse(Console.ReadLine(), out numerEwidencyjny)); 
            } 
 public void ZmienAdres() 
            { 
                Console.Write("Podaj nazwę miejscowści: "); miejscowosc = 
Console.ReadLine(); 
                Console.Write("Podaj nazwę ulicy "); nazwaUlicy = Console.ReadLine(); 
                Console.Write("Podaj kod: "); kod = Console.ReadLine(); 
                do 
                { 
                    Console.Write("Podaj numer domu: "); 

                } 
                while (!int.TryParse(Console.ReadLine(), out numerDomu)); 

                Console.Write("Czy jest numer mieszkania <t/n>: "); 
                char c = Console.ReadKey().KeyChar; 
                if (c == 't') 
                { 
                    Console.WriteLine(); 
                    do 
                    { 
                        Console.Write("Podaj numer meszkania: "); 
                    } 
                    while (!int.TryParse(Console.ReadLine(), out numerMieszkania)); 
                } 
                else 
                { 
                    numerMieszkania = 0; 
                } 
            }

  public Osoba Klonuj() 
            { 
                return (Osoba)this.MemberwiseClone(); 
            } 
        } 
}

Klasa Program

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

namespace Kadry
{
    public class Program
    {
        static void Main(string[] args)
        {
            Osoba os1 = new Osoba(5, "Ola", 43);
            Console.WriteLine(" Oryginał {0}", os1.ZwrocInformacjeOsobowe());
            Console.WriteLine("\n***Zmieniamy klon:***\n");
            Osoba klon1 = os1.Klonuj();
            Console.WriteLine("\n Klon: {0}", klon1.ZwrocInformacjeOsobowe());
            klon1.ZmienDaneOsobowe();
            klon1.ZmienAdres();
            Console.WriteLine("\n Klon: {0}", klon1.ZwrocInformacjeOsobowe());

            Osoba os3 = new Osoba(ref os1);
            Console.WriteLine(" Oryginał {0}", os3.ZwrocInformacjeOsobowe());
            Console.WriteLine("\n***Zmieniamy klon:***\n");
            Console.WriteLine("\n Klon: {0}", klon1.ZwrocInformacjeOsobowe());
            klon1.ZmienDaneOsobowe();
            klon1.ZmienAdres();
            Console.WriteLine("\n Klon: {0}", klon1.ZwrocInformacjeOsobowe());
            Console.ReadKey();
        }

    }

}

Jave ostatni raz widziałem na studiach i nawet nie zerknąłem we fragmenty kodu które nie były istotne. Podstawowy błąd atrybucji, miałem Jave na studiach, uczą jej na wielu uczelniach, nie wpadłem na pomysł, że to może być C# :slight_smile:. Dopiero po Twoim poście uświadomiłem sobie, że przecież mi kompletnie nie leżała składnia wywoływania konstruktora na liście inicjalizacyjnej czego nie ma w Javie. A cały czas się głowiłem skąd pomysł na taki sytanx :smiley:.

Spoko

Tego nie można usunąć można tylko zmienić tak żeby działało:

Czyli udało się już znaleźć problem czy nie?

Przy okazji skoro ładujesz bibliotekę

using System; 

to wszystko pod spodem nie jest przypadkiem zbędne, bo już się w niej zawiera?

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

Usingi z tego co rozumiem są napisane przez wykładowcę i nie można tego ruszać. Ma nie do końca działający program i ma go uzupełnić. W sumie chodzi o dopisanie konstruktora bez parametru adres.

Niestety nadal wywala błąd przy kompilowaniu. Nie podoba się mu return adres.kod;
Jak to poprawić żeby działało?

public string ZwrocKod()
        {
            return adres.kod;
        }

        public string ZwrocMiejscowosc()
        {
            return adres.miejscowosc;
        }

        public string ZwrocNazweUlicy()
        {
            return adres.nazwaUlicy;
        }
       
        public int ZwrocNumerDomu()
        {
            return adres.numerDomu;
        }

        public int ZwrocNumerMieszkania()
        {
            return adres.numerMieszkania;
        }

        public string ZwrocInformacjeOsobowe()
        {
            return string.Format("\n Pan(i) {0} {1} o numerze ewidencyjnym: {2} zamieszkały(a): {3} {4} {5}",
            nazwisko, imie, numerEwidencyjny, ZwrocKod(), ZwrocMiejscowosc(),
          ZwrocNazweUlicy() + " " + ZwrocNumerDomu() + " m" + ZwrocNumerMieszkania());
        }

Visual Studio takie usingi daje.

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

Ok puściłem ten twój kod i nie widzę problemów?
https://dotnetfiddle.net/OvEMEh

Tylko zmieniłem miejsca gdzie oczekujesz wartości, bo nie da się ich wprowadzać w tym kompilatorze, więc zmieniłem na jakieś stałe.

+ ze zmienionym tym fragmentem co napisał @kowgli