O título diz tudo.
Eu preciso de um cenário onde o polimorfismo seja a única solução. Eu tenho visto muitos segmentos com benefícios de polimorfismo, mas eu acho, cenário em que a solução com apenas polimorfismo está faltando.
Outra maneira de fazer a mesma pergunta é:
"Qual é a origem do polimorfismo?"
Respostas:
0 para resposta № 1Sua pergunta está de alguma forma aberta à interpretação.
Deixe-me tentar responder a sua pergunta, primeiro desenhe uma linha entre:
- Polimorfismo como um conceito abstrato
- Polimorfismo diretamente suportado por linguagens de programação e compiladores como C ++, Java, C #, etc
O exemplo padrão para o polimorfismo pode ser umferramenta de gráficos de vetor como, e. Corel Draw, Inkscape. Suponha que você gostaria que o usuário pudesse desenhar várias formas geográficas diferentes (quadrado, triângulo, círculo) em uma tela.
Eu agora sugiro que o CONCEITO de polimorfismo éa única solução para esse problema e, ao mesmo tempo, é claro que você será capaz de escrever uma solução em qualquer linguagem de programação, incluindo aquelas que não oferecem um mecanismo integral de polimorfismo (como, por exemplo, C).
O polimorfismo explícito se tornará evidente na forma de várias condições "se".
Assim: O CONCEITO de Polimorfismo é sempre a única solução, se:
- você tem várias cópias de entidades que compartilham um subconjunto de comportamento comum, mas também cada classe tendo algum comportamento especial especial para essa classe apenas
- na compilação você não sabe o que classe concreta será necessária, apenas em tempo de execução
Sua pergunta sobre a "origem" dePolimorfismo. O conceito de polimorfismo é algo eminente, como Primes, pelo menos me sinto assim. O suporte implícito do polimorfismo em linguagens de programação começou com o C ++ no início dos anos 90, os primeiros programas WYSWG como o Corel Draw e Word e O livro (isso é claro, uma observação pessoal)
Abaixo um exemplo.
// example WITH implicit polymorphism
abstract class PolyGeometricEntity
{
public int center_x__mm; // commen superset
public int center_y__mm; // commen superset
public void move(int d_x__mm, int d_y_mm) // commen superset
{
center_x__mm += d_x__mm;
center_y__mm += d_y_mm:
}
public abstract int area(); // commen superset on abstract level, but specialized at implementation level
public abstract void draw(); // commen superset on abstract level, but specialized at implementation level
}
class CircleEntity : PolyGeometricEntity
{
public override int area()
{
// circle specific
return 1;
}
public override void draw()
{
// draw a circle
}
}
class TriangleEntity : PolyGeometricEntity
{
public override int area()
{
// triangle specific
return 1;
}
public override void draw()
{
// draw a triangle
}
}
class PolyCanvas
{
List<PolyGeometricEntity> entities = new List<PolyGeometricEntity>();
void CreateEntity(string toCreateClass)
{
// assume that code is called by the ui
// you do not know what the user decides at runtime
// Polymorphism "starting" now:
PolyGeometricEntity toCreate = null;
if (toCreateClass == "c") { toCreate = new CircleEntity(); }
else if (toCreateClass == "t") { toCreate = new TriangleEntity(); }
entities.Add(toCreate);
}
void ReDraw()
{
foreach (PolyGeometricEntity toDraw in entities)
{
toDraw.draw(); // polymorphism in action!
}
}
}
// example WITHOUT implicit polymorphism
abstract class NonPolyGeometricEntity
{
public int center_x__mm; // commen superset
public int center_y__mm; // commen superset
public string entityClass;
public void move(int d_x__mm, int d_y_mm) // commen superset
{
}
// explicid Polymorphism, but concept of Polymorphism still present
public int area()
{
if (entityClass == "c")
{
// return area of cirlce
}
else if (entityClass == "t")
{
// return area of triangle
}
return 0;
}
public void draw()
{
if (entityClass == "c")
{
// draw area of cirlce
}
else if (entityClass == "t")
{
// draw area of triangle
}
}
}
class NonPolyCanvas
{
List<NonPolyGeometricEntity> entities = new List<NonPolyGeometricEntity>();
void CreateEntity(string toCreateClass)
{
// assume that code is called by the ui
// you do not know what the user decides at runtime
NonPolyGeometricEntity toCreate = null;
toCreate.entityClass = toCreateClass; //explit polymorphism
entities.Add(toCreate);
}
void ReDraw()
{
foreach (NonPolyGeometricEntity toDraw in entities)
{
toDraw.draw();
}
}
}