Forum Gry Hobby Sprzęt Rozmawiamy Archiwum Regulamin

Forum: Pomoc z C# - rozróżnienie typu zmiennej i późniejsze odwołanie się do niej.

12.07.2012 19:25
1
Telemach
105
Who am I?

Pomoc z C# - rozróżnienie typu zmiennej i późniejsze odwołanie się do niej.

Sprawa wygląda tak, że użytkownik wskazuje obiekt. Może wybrać Obiekt1 albo Obiekt2.
Oba obiekty mają wiele "wspólnych" (takich samych) metod, właściwości, ale rzutowanie obiektu Obiekt1 na Obiekt2 prowadzi do błędu.

Jak mogę zrobić tak, aby użytkownik wskazał obiekt. Następnie ja sprawdzam czy jest to Obiekt1 czy Obiekt2 i rzutuję odpowiednio?

Próbowałem wpakować to w Ifa, ale przy późniejszej próbie dobrania się do metody/właściwości otrzymuję błędy, że obiekt nie zawiera metody/właściwości.

12.07.2012 19:30
2
odpowiedz
Shoker1
93
Slowhand

Oba te obiekty sa instancjami roznych klas, czy tej samej?

12.07.2012 19:32
3
odpowiedz
Telemach
105
Who am I?

Różne klasy.

Mam klasę Dimension.
Klasy AlignedDimension i RotatedDimension dziedziczą po niej.

Niestety sama klasa Dimension nie ma metod, które są mi potrzebne, a są w Aligned i Rotated Dimension.

12.07.2012 19:46
GBreal.II
4
odpowiedz
GBreal.II
136
floydian

if (o1 is AlignedDimension)‹;
// zrzutuje się na AlignedDimension
›;

i analogicznie z drugą klasą

---[edit]---
możesz też użyć słowa kluczowego "as", które działa jak operator rzutowania, ale zamiast rzucać wyjątkami, to zwraca null, dzięki czemu możesz zrobić coś takiego:

AlignedDimension x = o1 as AlignedDimension;
if (x != null)‹
// cieszymy sie
› else ‹
to nie jest AlignedDimension. Sprawdzić inne klasy

12.07.2012 19:52
😊
5
odpowiedz
PaWeLoS
168
Admiral

To dodaj do klasy Dimension te metody, które potrzebujesz, jako metody wirtualne, a w klasach pochodnych dodaj slowo override przed definicjami tych metod.
To co proponuje GBreal jest zupełnie niezgodne ze sztuką. Tzn. używa się tego w zupełnie innym celu.

public abstract void MyMethod(); - to dodaj w klasie Dimension
public override void MyMethod() -> tak ma to wyglądać w AlignedDimension i RotatedDimension

Potem np.
if(userChoice == 0)
Dimension dimension = new AlignedDimension();
else if (userChoice == 1)
Dimension dimension = new RotatedDimension();

dimension.MyMethod() -> w zależności jaką klasę przypisałeś do tej referencji klasy Dimension wykona się metoda z AlignedDimension() lub RotatedDimension()

A potem poczytaj o polimorfizmie i metodach wirtualnych.
http://pl.wikipedia.org/wiki/Metoda_wirtualna

12.07.2012 20:12
6
odpowiedz
Grzesiek
78
Legend

@PaWeLoS

Jako, iż piszę dodatek pod AutoCADa to nie mam bezpośredniego dostępu do danych klas.

Muszę wykonać takie same operacje na obiekcie 1 lub 2, także chyba pozostanie mi upakowanie w metodę całego zaplecza i wrzucenie do ifa jak najmniejszej ilości kodu :)

Forum: Pomoc z C# - rozróżnienie typu zmiennej i późniejsze odwołanie się do niej.