Witam,mam pytanko do Was,czy polimorfizm to jest nic innego jak rozbudowywanie metod klasy bazowej w dalszych klasa dziedziczacych? Dobrze mowie czy nie do końca? I jeszcze jesli chodzi o operator new w metodach to wywolanie go w klasie dziedziczacej powoduje, ze nie widac metody klasy bazowej tylko Od razu tą z operatorem new? Dobrze to rozumiem?
- Nie, bo rozróżniamy więcej niż jeden typ polimorfizmu.
- Nie. To mógłbyś zrobić bez żadnego polimorfizmu przecież. Istotą jest tutaj fakt że trzymasz obiekty jako referencje/wskaźnik do typu bazowego i wywołujesz metody. Na dobrą sprawę to nie wiesz co to jest za obiekt, a i tak wywołują się odpowiednie metody.
Czyli:
Figura* jakas_figura = new Kolo();
jakas_figura->rysuj();
spowoduje namalowanie koła.
3. Nie rozumiem o co ci chodzi z tym new.
Polimorfizm jest najlepiej opisany w książce Gebosza "Symfonia C++"
A tak w ogóle to polega to na tym że:
class A{
virtual rysuj()
}
class B : A
{
override rysuj()
{
print("B");
}
}
class C: A {
overide rysuj()
{
print ("C")
}
}
A obj = new B();
A obj = new C();
teraz jak wywołasz
A rysuj to kompilator wywoła odpowiednią metodę rysuj() pomimo tego że objekty B, C zostały utworzone poprzez A obj...
Normalnie to powinno być:
B obj = new B();
C obj = new C();
no ale my zrobiliśmy to polimorficznie czyli tak:
A obj = new B();
A obj = new C();
teraz jak wywołasz to w kodzie tak
A->rysuj(); // print B
A-> rysuj();// print C
albo tak
void fun( A objekt )
{
A->rysuj() ; // tutaj kompilator wywoła opowiednią wersje metody rysuj w zależności od tego czy A wskazuję na B czy C
}
dzięki temu możesz sobie zrobić np. Tablice
A [] arr = new A[100];
i wywołać rysuj
arr[i]-> rysuj() i kompilator będzie wywoływał odpowiednie metody klas potomnych
a i jest jeszcze polimorfizm interfejsów ... no ale o tym to sobie już poczytasz np. w książce o C# albo Javie
Mój błąd chodzi mi o język c#.
we wszystkich językach jest tak samo
jeśli chodzi o c# to jest on dobrze opisany w książce Andrew Troelsena :Język C# 2008 i platforma
Żadna różnica czy mowa tu o C# Javie czy C++. Z tą rożnicą ze w Javie i C# wszystko z automatu jest referencją i polimorfizm działa niejako defaultowo.
tu masz ładny przykład: http://www.pragimtech.com/Polymorphism.aspx
No ale tutaj przeciez widac ze ta override jest wyswietla to samo co virtual a dodatkowo jeszcze to: System.Console.WriteLine("Wartość liczby c wynosi: {0}", c +"."); Tylko ja to widze ?
public virtual void Wyswietl()
{
System.Console.WriteLine("Wartości a i b wynoszą odpowiednio: {0} i {1}", a, b +".");
}
a tu w dziedziczacej:
public override void Wyswietl()
{
base.Wyswietl();
System.Console.WriteLine("Wartość liczby c wynosi: {0}", c +".");
}
using System;
public class Customer
{
public virtual void CustomerType()
{
Console.WriteLine("I am a customer");
}
}
public class CorporateCustomer : Customer
{
public override void CustomerType()
{
Console.WriteLine("I am a corporate customer");
}
}
public class PersonalCustomer : Customer
{
public override void CustomerType()
{
Console.WriteLine("I am a personal customer");
}
}
public class MainClass
{
public static void Main()
{
Customer[] C = new Customer[3];
C[0] = new CorporateCustomer();
C[1] = new PersonalCustomer();
C[2] = new Customer();
foreach (Customer CustomerObject in C)
{
CustomerObject.CustomerType();
}
}
}
odpal sobie ten przykład i zobacz co to jest polimorfizm
To jest polimorfizm:
Customer[] C = new Customer[3];
C[0] = new CorporateCustomer();
C[1] = new PersonalCustomer();
C[2] = new Customer();
foreach (Customer CustomerObject in C)
{
CustomerObject.CustomerType(); // inteligentne wywołania polimorficzne
}
chodzi o to że wszystkie obiekty potomne są zapisane w tablicy której typem jest kasa bazowa a kompilator i tak się orientuję którą metodę ma wywołać...
chodzi o to że wszystkie obiekty potomne są zapisane w tablicy której typem jest kasa bazowa a kompilator i tak się orientuję którą metodę - z klasy potomnej - ma wywołać...
No ale przecież nikt nie broni nie wypisywać base.Wyswietl().
Możesz tam mieć zupełnie inne ciało funkcji.
No ok to w taki razie podajcie jakis przyklad kiedy nalezy albo warto stosowac ten polimorfizm?
no to sobie poszukaj. Daliśmy ci wędkę a ty musisz sam złowić rybę ....
No dobra jesli to nie jest ulepszanie metody z klasy bazowej to dlaczego napisali cos takiego "Po prawidłowym zadeklarowaniu metody wirtualnej w klasie bazowej, w każdej klasie pochodnej może znaleźć się nowa wersja tej metody.Aby utworzyć nową wersję metody MojaWirtualna() należy ją przesłonić w klasie pochodnej, używając do tego nowego modyfikatora: override" ??
A która część tego zdania wskazuje na jakieś "ulepszanie"? o_O
Jest napisane wyraźnie "NOWĄ WERSJĘ METODY". To 89 w twoim nicku to waga czy IQ? Bo nie uwierzę że rocznik...
haha taki byl dostepny to taki mam
Dziedziczenie, metody wirtualne, przeciążanie, szablony te pojęcia ściśle wiążą się z polimorfizmem. Mechanizmy te są narzędziami polimorficznymi mającymi na celu ułatwienie życia programiście przez zmniejszenie do minimum konieczności powielania kodu.
Śmiechowo tutaj - ktoś zadał pytanie bez sprecyzowania języka i zamiast pytania o co mu dokładnie chodzi dostał referaty o tym jak to wygląda w C++, jakby innych języków nie było. ;P
Shalom napisał(a)
Z tą rożnicą ze w Javie i C# wszystko z automatu jest referencją i polimorfizm działa niejako defaultowo.
Nie wiem jak w Javie, ale w C# tak nie jest.
A new w C# służy do wyłączenia ostrzeżenia o niejawnym nadpisaniu metody, która w klasie bazowej jest niewirtualna bądź miała inny typ zwracany.
Somekind - zanim coś napiszesz to przejrzyj sobie wszystkie posty...Podałem gościowi przykład w C#...
Somekind - ty buraku
Tak przy okazji jaka jest roznica pomiedzy metoda wirtualna a zwykla?