visual polimorfismo net herencia form c# .net vb.net

net - polimorfismo en c# windows form



¿Cuándo debe declararse un miembro de la clase virtual(C#)/Overridable(VB.NET)? (9)

Hay una lista aquí para tener en cuenta con Windows Forms.

Si desea un Control / UserControl desde el que pueda heredar, incluso si no tiene lógica en la clase base, no quiere que sea abstracto, porque de lo contrario no podrá usar el Diseñador en las clases derivadas: http : //www.urbanpotato.net/default.aspx/document/2001

¿Por qué no elegiría el resumen? ¿Cuáles son las limitaciones para declarar virtual a un miembro de la clase? ¿Pueden solo los métodos ser declarados virtuales?


Resumen significa que no puede proporcionar una implementación predeterminada. Esto a su vez significa que todas las subclases deben proporcionar una implementación del método abstracto para poder ser instanciables (concretas).

No estoy seguro de lo que quiere decir con "limitaciones", por lo que no puedo responder ese punto.

Las propiedades se pueden declarar virtuales, pero conceptualmente también se pueden considerar métodos.


Si desea darle una implementación en su clase base, hágalo virtual; si no lo hace, lo hará abstracto.

Sí, solo los métodos se pueden declarar virtuales.



Un método o propiedad abstracta (ambos pueden ser virtuales o abstractos) solo se puede declarar en una clase abstracta y no puede tener un cuerpo, es decir, no se puede implementar en su clase abstracta.

Un método o propiedad virtual debe tener un cuerpo, es decir, debe proporcionar una implementación (incluso si el cuerpo está vacío).

Si alguien quiere usar su clase abstracta, deberá implementar una clase que herede de ella e implementar explícitamente los métodos y propiedades abstractos, pero puede optar por no anular los métodos y propiedades virtuales.

Ejemplo:

using System; using C=System.Console; namespace Foo { public class Bar { public static void Main(string[] args) { myImplementationOfTest miot = new myImplementationOfTest(); miot.myVirtualMethod(); miot.myOtherVirtualMethod(); miot.myProperty = 42; miot.myAbstractMethod(); } } public abstract class test { public abstract int myProperty { get; set; } public abstract void myAbstractMethod(); public virtual void myVirtualMethod() { C.WriteLine("foo"); } public virtual void myOtherVirtualMethod() { } } public class myImplementationOfTest : test { private int _foo; public override int myProperty { get { return _foo; } set { _foo = value; } } public override void myAbstractMethod() { C.WriteLine(myProperty); } public override void myOtherVirtualMethod() { C.WriteLine("bar"); } } }


Un miembro debe declararse virtual si hay una implementación base, pero existe la posibilidad de que esa funcionalidad se anule en una clase secundaria. Virtual también se puede usar en lugar de abstracto para permitir que la implementación de un método sea opcional (es decir, la implementación base es un método vacío)

No hay ninguna limitación al configurar un miembro como virtual, pero los miembros virtuales son más lentos que los métodos no virtuales.

Ambos métodos y propiedades se pueden marcar como virtuales.


Utilizaría el resumen si no desea definir ninguna implementación en la clase base y desea forzar su definición en cualquier clase derivada. Defínalo como virtual si desea proporcionar una implementación predeterminada que pueda ser modificada por las clases derivadas.

Sí, solo los métodos pueden ser virtuales.


Antes que nada, te responderé la segunda pregunta. Solo los métodos se pueden declarar virtuales. Elegiría virtual en lugar de abstracto cuando desee alguna funcionalidad predeterminada en su clase base, pero desea dejar la opción de anular esta funcionalidad por clases heredadas de su clase base. Por ejemplo:

Si está implementando la clase Shape , probablemente tenga un método llamado getArea () que devuelve el área de su forma. En este caso, no existe un comportamiento predeterminado para el método getArea () en la clase Shape, por lo que lo implementaría como abstracto . Implementar un método como abstracto le impedirá crear una instancia de un objeto Shape .

Por otro lado, si implementa la clase Dog , es posible que desee implementar el método Bark () en este caso, es posible que desee implementar un sonido de ladrido predeterminado y ponerlo en la clase Dog , mientras que algunas clases heredadas, como el clase Chiwawa puede querer anular este método e implementar un sonido de ladridos específico. En este caso, el método ladrar se implementará como virtual y podrás instanciar tanto perros como Chiwawas.


Personalmente marcó la mayoría de los métodos y propiedades virtuales. Utilizo proxies y cargas flojas mucho, así que no quiero tener que preocuparme de cambiar las cosas en una fecha posterior.