Dziedziczenie a przypisywanie obiektów

0

Mam klasy

 
public class Figura{
      public string Nazwa;
      public Figura(string nazwa)
      {
           this.Nazwa = nazwa;
       }
}
public class Kwadrat : Figura
{

}

No i ja potrzebuję żeby ten Kwadrat był rozszerzeniem Figury tylko. W tym wypadku nawet nie ma własnych pól jeszcze a takie coś:

 
Figura figura = new Figura("jakaś");
Kwadrat kwadrat = figura;

Nie zadziała. Da się jakoś to zrobić by działało?

0

W złą stronę to robisz. Kwadrat jest figurą, ale figura niekoniecznie jest kwadratem, dlatego nie możesz przypisać figury do kwadratu. Możesz natomiast tak:

 
Kwadrat kwadrat = new Kwadrat();
Figura fig = kwadrat;

Swoją drogą dziedziczysz po klasie Figura, która nie ma konstruktora domyślnego. Jak tworzysz obiekt klasy kwadrat to (w uproszczeniu) jednocześnie tworzysz obiekt klasy Figura. Musisz zdefiniować konstruktor w klasie Kwadrat i wywołać z listy inicjalizacyjnej konstruktor klasy Figura, albo utworzyć konstruktor domyślny dla klasy Figura

0

No tak,
bardziej chciałem osiągnąc coś takiego że wszędzie mam Figury a w jednym przypadku potrzebuję Figurę rozszerzoną o jakieś pole. nazwałem to Kwadrat no i chciałem by było tak że gdy przypisuję Figurę do Kwadratu to w Kwadracie wszystko co zawiera Figura jest wypełniane a to dodatkowe pole które ma Kwadrat jest np null.

0

Hmmm chyba coś takiego się nada:

public class Kwadrat : Figura
{
    public Kwadrat(Figura source)
    {
         this.Nazwa = source.Nazwa;
         this.costam = source.costam;
    }
}
0

A da się przeciążyć operator "=" ?
Żeby przeciążyć tak że gdy do Kwadratu jest przypisywana figura to żeby te pola tak poprzepisywał "ręcznie" jak podałeś?

2

To jest błędne podejście wynikające z nieznajomości języka. Klasy to typy referencyjne i operator przypisania nie robi tego co Ci się wydaje, że robi - NIE kopiuje obiektów. Dodatkowo obiekt w trakcie swojego życia nie może zmienić swojego typu(dzięki Bogu).

Rozwiązaniem może być stworzenie konstruktora w klasie Kwadrat, który przyjmuje obiekty typu Figura i wtedy:

Figura figura = new Figura();
Kwadrat kwadrat = new Kwadrat(figura);

Inną opcją jest stworzyć operator konwersji z figury na kwadrat.

//edit: w C# nie można przeciążać operatora =

0

Przypisanie w konstruktorze nie zadziała jeśli Propertiesy w Figura będą readonly

0

Możesz przeciążyć sobie np. procedure konwersji niejawnej:

public static implicit operator Kwadrat(Figura figura)
{
//...
}

Wtedy kod z pierwszego postu zadziała.

2

Definiowanie operatora rzutowania do albo z klasy bazowej jest w C# NIEMOŻLIWE. Trzeci raz o tym na forum piszę.

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