Polimorfizm?

0

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?

0
  1. Nie, bo rozróżniamy więcej niż jeden typ polimorfizmu.
  2. 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.

0

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
}

0

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

0

a i jest jeszcze polimorfizm interfejsów ... no ale o tym to sobie już poczytasz np. w książce o C# albo Javie

0

Mój błąd chodzi mi o język c#.

0

we wszystkich językach jest tak samo

0

jeśli chodzi o c# to jest on dobrze opisany w książce Andrew Troelsena :Język C# 2008 i platforma

0

Ż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.

0

tu masz ładny przykład: http://www.pragimtech.com/Polymorphism.aspx

0

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 +".");
}

0
 
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();

        }

    }

}
0

odpal sobie ten przykład i zobacz co to jest polimorfizm

0

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

        }
0

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ć...

0

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ć...

0

No ale przecież nikt nie broni nie wypisywać base.Wyswietl().
Możesz tam mieć zupełnie inne ciało funkcji.

0

No ok to w taki razie podajcie jakis przyklad kiedy nalezy albo warto stosowac ten polimorfizm?

0

no to sobie poszukaj. Daliśmy ci wędkę a ty musisz sam złowić rybę ....

0

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" ??

0

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...

0

haha taki byl dostepny to taki mam

0

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.

0

Ś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.

0

Somekind - zanim coś napiszesz to przejrzyj sobie wszystkie posty...Podałem gościowi przykład w C#...

0

Somekind - ty buraku

0

Tak przy okazji jaka jest roznica pomiedzy metoda wirtualna a zwykla?

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