Pregunta

Me gustaría saber si hay alguna función como método de herencia en lugar de la herencia de toda la clase, Permítanme desarrollar lo que estoy tratando de explicar:

class a {
   public void GetA(){
     // some logic here
}
}

class b {
    public void GetB() : new Class().GetA()
}

Sé que parece extraño, pero yo estaba leyendo cómo hacer delegación en el patrón de composición de objetos y pensé que este patrón por alguna razón.

¿Fue útil?

Solución

Si lo que desea es llamar Geta () dentro de GetB (), pero no quiere definir o explícitamente referencia a una instancia de la clase A en GetB (), puede pasar Geta () en calidad de delegado.

En C #, hay muchos delegados predefinidos tales como Acción y Func . O, siempre se puede rodar su propio delegado para que coincida con la firma del método.

    class a
    {
        public void GetA()
        {
            Console.WriteLine("Hello World!");
        }
    }

    class b
    {
        // No explicit reference to class a of any kind.
        public void GetB(Action action)
        {
            action();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var a = new a();
            var b = new b();

            b.GetB(a.GetA);
        }
    }

Otros consejos

Una forma común de hacer composición es crear una variable miembro privada en la clase B, de la clase de tipo A, y en GetB () llamada a.GetA (). Por ejemplo:

class a {
   public void GetA(){
     // some logic here
   }
}

class b {
    private a _a=new a();

    public void GetB()
    {
         _a.GetA();
    } 
}

Otra opción podría ser la definición de una variable miembro delegado pidió que en lugar de GetB método simple y permitir que el código de llamada para suministrar el código que es ejecutado por GetB ().

Lo más parecido que se me ocurre es la forma en C # se puede "heredar" el constructor de una clase en el de su clase hija (o un constructor sobrecargado de la misma clase), así:

class Animal {
    public string Species { get; set; }

    public Animal(string species) {
        Species = species;
    }
}

class Human : Animal {
    public string Name { get; set; }

    public Human(string name) : base("Homo sapien") {
        Name = name;
    }
}

El comportamiento del código anterior es bastante sencillo: el constructor de la clase Human llama esencialmente el constructor de la clase Animal antes de hacer cualquier otra cosa. ¿Por qué esta misma funcionalidad no está disponible para los métodos no-constructor, no estoy seguro.

Esto no es posible. Si quieres b.GetB reutilizar la funcionalidad de a.GetA entonces necesario crear una instancia a e invocar a.GetA.

un enfoque ligeramente diferente sería aceptar una instancia de ClassA en el constructor de ClassB, en lugar de instanciar directamente. Esto estaría aplicando el Dependencia Inversión Principio a @ respuesta de Ash:

public class ClassB
{
    private readonly ClassA _a;

    public b(ClassA a)
    {
        _a = a;
    }

    public void GetB()
    {
        _a.GetA();

        // Other logic
    }
}
public class Article
{

 public object AddOrUpdate(params object[] paras){

   return null;

  }

}

public class Test:Article
{

 public new object AddOrUpdate(params object[] paras){

   //do your logic......

    return base.AddOrUpdate(paras);

 }


}

quiere decir esto? Esto es inhret una clase puede hacer obtener o establecer la propiedad objeto de base.

si lo hace con el delegado, se debe hacer más trabajo con la misma lógica.

pero delegado puede obtener el objeto de dominio diffenent y hacer más cosas sobre la aplicación.

Si Geta () se cambia a un método estático, sólo tiene que llamar dentro del GetB () Función:

class a { 
   public static void GetA() { 
     // some logic here 
   } 
} 

class b { 
    public void GetB() {
      a.GetA();
    }
} 

Si Geta () no es estática, no tiene sentido ya que Geta () necesita un contexto de objeto (por ejemplo., Lo invisible puntero "this") por definición. No se puede pasar una instancia del objeto B a la clase A, clase A no sabe nada acerca de la clase B.

Lo que en realidad tratando de hacer?

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