• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rzutowanie polimorficzne c#

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
3,265 wizyt
pytanie zadane 25 lipca 2015 w C# przez achilles147 Dyskutant (9,580 p.)

Witam Mam małe pytanie

mam następujący kod:

  public class BaseClass
    {
        protected string name;

        public virtual string MyMethod()
        {
            name = "BaseClass name";

            return name;
        }

        public T getModel<T>() where T : BaseClass
        {
            return (T) this;
        }
    }

public class DerrivedClass : BaseClass
    {
        public override string MyMethod()
        {
            name = "DerrivedClass Name";

            return name;
        }
    }
////
BaseClass myObj = new BaseClass();
            var check1 = myObj.MyMethod();
            var check2 = myObj.getModel<DerrivedClass>();
            var check3 = check2.MyMethod();

 

I cały program mi się wywala. W sumie to nie dokońca wiem co chciałem osiągnąc ale to czysto w kwesti nauki. Stworzyłem w klasie base metode, której zadanie było rzutowanie typu bazowego na jakis dziedziczony. Mógłby mi ktoś pomóc wyjaśnić o co tu chodzi?

1 odpowiedź

+1 głos
odpowiedź 25 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
wybrane 27 lipca 2015 przez achilles147
 
Najlepsza

Nie mozna rzutować wyżych klas na dół...

Jeśli ma się klasę bazową i się ją stworzy to z góry wiemy że rzutowanie do bardziej rozwiniętych klas jest niemoźliwe...

 
Jeśli masz np. BaseClass myObj = new DerrivedClass();

To możesz bezproblemowo możesz rzutować w dół.

Streszczenie: Obiekt klasy X który dziedziczy z klasy Y może zostać rzutowany na kasę Y, jeśli klasa także coś dziedziczy ( np.Klasa J) to ten obiekt klasy X może także być rzutowany do klasy J.

Ale jeśli tworzyliśmy Obiekt klasy J to nie można rzutować niżej! gdyż rozerzenia które występują niźej nie istnieją w klasie J!

 

Tu prosty przykład:

using System;
using System.Text;

namespace TestMode
{
	public class BaseClass
	{
	}

	public class DerrivedClass : BaseClass
	{
	}

	public class klasa : DerrivedClass
	{}

	public class MainClass
	{
		public static void Main ()
		{
			BaseClass myObj = new klasa();
			DerrivedClass der = (DerrivedClass)myObj; //No problem
			klasa kl = (klasa)myObj; //No problem

			myObj = new DerrivedClass();
			der = (DerrivedClass)myObj; //No problem
			kl = (klasa)myObj; //problem!

			myObj = new BaseClass();
			der = (DerrivedClass)myObj; //problem!
			kl = (klasa)myObj; //problem!

			Console.ReadKey ();
		}
	}
}

i przy okazji, nie używaj varów. takiemu noobowi jak ja zajeło mi jakieś 10 minut aby ogarnąć twój kod, dopiero po zmianie na poszczególne typy danych znacząco ułatwiło mi czytanie.

Więc podejrzewam że ty także możesz mieć problemy z tym jak "będzieś do czegoś wracał".

Pozdrawiam.

komentarz 25 lipca 2015 przez achilles147 Dyskutant (9,580 p.)
edycja 25 lipca 2015 przez achilles147
i tu Cię trochę zaskoczę bochyba  można castować. Po chwili kombinowania udało mi się zrobić coś takiego(dla tych samych klas) :

               DerrivedClass mySecondObj = new DerrivedClass();
                string name1 = mySecondObj.MyMethod(); <-- name2 = "DerrivedClass name"
                BaseClass BaseClassObject  = (BaseClass) mySecondObj;
                string name2 = BaseClassObject.MyMethod();<- name4="BaseClass name"
                var DerrivedObj = BaseClassObject.getModel<DerrivedClass>();
                string name3 = DerrivedObj.MyMethod(); <- name3= "DerrivedClass name"

PS : co do varów to niestety wina ReSharpera :) ale fakt na forum może być to mniej zrozumiałe.
komentarz 25 lipca 2015 przez Dorion300 Szeryf (90,250 p.)

A wiesz dlaczego?

Bo masz to:

DerrivedClass mySecondObj = new DerrivedClass();

Zamiast tego:

BaseClass myObj = new BaseClass();

 

Zmień z powrotem na "new BaseClass();" i znowu będziesz miał problem.

komentarz 25 lipca 2015 przez achilles147 Dyskutant (9,580 p.)
tak dokładnie:) ale o to mi chodziło właśnie.
komentarz 25 lipca 2015 przez Dorion300 Szeryf (90,250 p.)

i tu Cię trochę zaskoczę bochyba  można castować.

 

No to właśnie o tym piszę.

ze trzeba robić takie rzeczy jak:

BaseClass mySecondObj = new DerrivedClass();
DerrivedClass mySecondObj = new DerrivedClass();

Ponieważ nie można obiektu BaseClass rzutować do DerrivedClass.(rzutowanie w dół niź powinno)

 

A to całe "<-- name2 = "DerrivedClass name"" jest raczej nie potrzebne...

komentarz 27 lipca 2015 przez achilles147 Dyskutant (9,580 p.)

Ale ja własnie to zrobiłem ( tak mi się zdaje przynajmniej):

1. tworzę obiekt typu DerrivedClass ( pochodny)

  DerrivedClass mySecondObj = new DerrivedClass(); 

2. tworzę referencje type BaseClass i inicjalizuję ją rzutując obiekt powyżej:

BaseClass BaseClassObject  = (BaseClass) mySecondObj; 

3. Mając typ BaseClass uruchamiam generyczną metodę getModel<DerrivedClass>() która zwraca mi obiekt o type generycznym ( w tym wypadku DerrivedClass) i w tym miejscu właśnie dokonałem rzutowania z BaseClas Na DerrivedClass (typ bazowy na pochodny).

 

Oczywiście moge się mylić bo jestem słabiakiem w progsach :D

 

komentarz 27 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
Jak już to rzutowałeś wskażnik a nie cały obiekt.

Zmienne to tak jakby wskażniki.

w C++ jak się rzutowało obiekt (nie wskażnik) do góry to się ucinał i spowrotem już nie da.

A w C# wszystkie definicje typu "MyClass ob;" to ukryte wskażniki które jedynie wskazują na obiekt.
komentarz 27 lipca 2015 przez achilles147 Dyskutant (9,580 p.)
Dzięki w za pomoc!:D

Podobne pytania

0 głosów
1 odpowiedź 345 wizyt
pytanie zadane 18 kwietnia 2016 w C# przez timrh Mądrala (6,010 p.)
+1 głos
0 odpowiedzi 151 wizyt
pytanie zadane 16 czerwca 2022 w C# przez mateusz45 Gaduła (3,280 p.)
0 głosów
0 odpowiedzi 131 wizyt
pytanie zadane 28 kwietnia 2018 w C# przez PięćCzySześć Użytkownik (770 p.)

93,439 zapytań

142,431 odpowiedzi

322,674 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...