Pregunta

Tengo una clase de ejemplo:

class SampleClass
{
   public virtual string SomeProperty{get; set;}
   public virtual void SomeMethod() {
      // code
   }
}

Me pueden heredar de ella y anular SomeProperty y SomeMethod como esto:

class ChildClass:SampleClass
{
   public override string SomeProperty{get; set;}
   public override void SomeMethod() {
      // code
   }
}

¿Hay alguna manera de poder anular de un objeto , y no de una clase? Como

SampleClass sampleObject = new sampleObject();

Y tienen sampleObject.SomeMethod () sea único? Gracias.

¿Fue útil?

Solución

No, no se puede anular en un objeto por objeto. Sin embargo, si usted quiere dar diferentes objetos diferentes modelos de comportamiento, siempre se puede pasar de un delegado para el constructor:

public class ChildClass : SampleClass
{
   private readonly Action someMethodBehavior;

   public ChildClass(Action someMethodBehavior) {
       this.someMethodBehavior = someMethodBehavior;
   }

   public override void SomeMethod() {
      someMethodBehavior();
   }
}

Eso permite que cada objeto de especificar de manera efectiva su propio comportamiento. Incluso se puede permitir que un delegado de referencia nula en el sentido de "sólo realizar la acción predeterminada" si se quería que fuera una especie de exclusión en anulación.

Otros consejos

No del todo seguro de lo que estamos tratando de lograr, pero usted acaba de hacer

SampleClass sampleObject = new ChildClass();

A continuación, puede pasar sampleObject a cualquier función que tuvo un SampleClass, a pesar de que en realidad es un ChildClass, y dado que sus funciones son virtuales, sus funciones sobrescritos sería llamado.

No - no hay manera de que se puede reemplazar por un objeto! De hecho, creo que usted no entiende lo es- y el objeto de un objeto es una instancia de una clase. Un objeto de su auto doesnt han definido métodos y propiedades, que provienen de la clase a la que 'pertenece' el objeto.

Sonidos para mí que si tiene que tratar de hacer este tipo de cosas, entonces van por el camino equivocado ...

Su pregunta es un poco confuso, pero creo que no se puede hacer exactamente lo que quiere - clases anónimas no existen en C # como en Java. Lo que se necesita para crear una subclase de anulación y método para esa instancia. Se podría hacer lo privado subclase dentro de la clase que está declarando en el código, de esa manera sólo se podía acceder como SampleClass, y no un ChildClass

Parece que estás pasando posiblemente por algo por el camino equivocado y no estoy seguro de por qué no se podría crear una clase de niño con un método SomeMethod() reemplazado, pero ...

La única manera podría ser la creación de forma explícita la clase con esto en mente, manteniendo una propiedad delegado. Entonces SomeMethod() llamarían el delegado (presumiblemente establece cuando se crea el objeto).

El delegado todavía no se le permitiría el acceso a los miembros privados o protegidos, sin embargo - sin algún argumento ingenioso pasar al menos -. Por lo que en realidad no veo mucha utilidad

No. Esto no es posible en C #. Habría que crear una nueva clase con su comportamiento deseado.

Clase es un modelo para sus casos ... ¿Por qué desea crear un objeto sin su impresión azul ...

Todos los tiempos de ejecución restringen a crear objetos sin un plano sin embargo se puede utilizar el objeto de obtener acceso a su proyecto original y esto se llama reflexión ... Un objeto refleja su proyecto original.

Creo que lo que mejor describe lo que es fingir clases anónimas en Java. C #, aunque, no le permite anular un método con un tipo anónimo, ni se le permite anular nada de hecho.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top