c# - puro - polimorfismo java
¿Cómo funcionan las funciones virtuales en C#y Java? (6)
Estoy seguro de que Java no usa vtables, ya que es compatible con la compatibilidad binaria.
Para aclarar: el vtable se genera cuando se compila la clase derivada / sub. Si el diseño de la base / superclase cambia, el vtable para el d / s necesita ser recompilado. En Java, este no es el caso. Puede cambiar las b / s sin tener que recompilar el d / s.
Hmmm. Es posible que un vtable se construya en tiempo de ejecución. cuando la clase está cargada En cuyo caso, Java y C ++ serían lo mismo pero diferentes.
¿Cómo funcionan las funciones virtuales en C # y Java?
¿Utiliza el mismo concepto vtable y vpointer similar a C ++ o es algo totalmente diferente?
No hay palabras clave virtuales en Java al menos.
Simplemente resuelve la versión más derivada del método al que llamas ...
class A{
void sayhi(){ System.out.println("A");}
}
class B extends A{
void sayhi(){ System.out.println("B");}
}
A a = new B();
a.sayhi();
Imprimirá "B".
Puede crear métodos "puros virtuales" declarando una clase Resumen y dejando los métodos virtuales puros declarados pero no implementados. O utilizando interfaces / implements en lugar de class / extends. Una interfaz es básicamente una clase donde todos los métodos son puramente virtuales. Esto tiene la ventaja añadida de que una clase puede implementar múltiples interfaces, ya que a diferencia de C ++, una clase Java solo puede heredar directamente otra clase.
EDITAR:
En respuesta a tu comentario, Naveen:
Si dijiste A a = nuevo A (); a.sayhi (); imprimiría "A".
La terminología de Java es dinámica. Puedes pensar que es virtual, pero eso puede confundir a algunos desarrolladores de Java. los que no conocen C ++, al menos. En Java no hay punteros explícitos, por lo que no es necesario preocuparse por virtual / no virtual. No hay VTables, solo retrocede la clase y sus antecesores hasta que encuentre una implementación del método que desea. Solo hay una herencia única, por lo que no tiene que preocuparse por el orden de los constructores (siempre es de abajo hacia arriba).
En C ++ obtienes un comportamiento diferente si tienes métodos virtuales y haces algo como
a->sayhi();
donde a estaba A * apuntando a una instancia de B en lugar de
a.sayhi();
donde a era un objeto de tipo A con un objeto de tipo B
Todos los lenguajes que admiten polimorfismo utilizan tablas virtuales para resolver llamadas de método a la función correcta. También Java y .NET.
Ambos compilan a algún lenguaje intermedio (IL para .NET y código de bytes para Java) pero el vtable no es visible en este lenguaje intermedio. Es compatible con el motor subyacente (CLR para .NET)
Las funciones virtuales puras están en C ++. C # usa interfaces para cumplir el mismo propósito, por lo que te sugiero que vayas por esa ruta.
En Java la función virtual es totalmente diferente. En Java, la función virtual significa una función que puede anularse en sus subclases. Entonces todos los métodos no estáticos de Java son funciones virtuales. Solo la función final y privada no se hereda, por lo que no son funciones virtuales.
Entonces podemos decir que todas las funciones no estáticas que no son finales y privadas son funciones virtuales en Java.
¿Cómo funcionan las funciones virtuales en Java?
Los entrevistadores de codificación adoran esta pregunta. Sí. Aunque Java NO tiene una palabra clave virtual, Java tiene funciones virtuales y usted puede escribirlas.
En la programación orientada a objetos, una función virtual o método virtual es una función o método cuyo comportamiento puede ser anulado en una clase heredada por una función con la misma firma. Este concepto es una parte muy importante de la porción de polimorfismo de la programación orientada a objetos (OOP).
Hacer una pregunta de arquitectura sobre un lenguaje específico como este requiere grandes habilidades de comunicación y un dominio profundo de los principios subyacentes del compilador de Java, específicamente interfaces, clases abstractas y cómo funciona la herencia.
Guíe al entrevistador a un ejemplo específico de una función virtual.
Sí, puede escribir funciones virtuales en Java con interfaces.
Los métodos de interfaz de Java son todos "puros virtuales" porque están diseñados para ser reemplazados. Por ejemplo:
interface Bicycle { //the function applyBrakes() is virtual because
void applyBrakes(); //functions in interfaces are designed to be
} //overridden.
class ACMEBicycle implements Bicycle {
public void applyBrakes(){ //Here we implementing applyBrakes()
System.out.println("Brakes applied"); //function, proving it is virtual.
}
}
Sí, puedes escribir funciones virtuales en Java con clases abstractas.
Las clases abstractas de Java contienen implícitamente métodos "virtuales", implementados por clases que lo amplían. Por ejemplo:
abstract class Dog {
final void bark() { //bark() is not virtual because it is
System.out.println("woof"); //final and if you tried to override it
} //you would get a compile time error.
abstract void jump(); //jump() is a virtual function because it
} //is part of an abstract class and isn''t
//final.
class MyDog extends Dog{
void jump(){
System.out.println("boing"); //here jump() is being overridden, a
} //demonstration that it is virtual.
}
public class Runner {
public static void main(String[] args) {
MyDog myDog = new MyDog(); //instantiating myDog
myDog.jump(); //calling the overridden function jump()
}
}
Puede forzar a una función a NO ser virtual en una clase genérica haciéndola final
Por ejemplo:
class myJavaFoobarClass {
final boolean giveMeTrueFunction() //this Java function is NOT virtual
{ //because final keyword prevents this
return true; //function from being modified in a
} //subclass.
boolean isItRainingFunction() //this Java function IS virtual because
{ //without the final keyword, the function
return false; //can be overridden in a subclass.
}
}