.net - poo - una interfaz puede heredar de una clase




¿Cómo definir la implementación predeterminada de una interfaz en c#? (2)

¿Tal vez te refieres a la Inyección de Dependencia? Donde al usar el marco DI (como Ninject o Unity), puede definir una instancia predeterminada para cada interfaz y luego usarla así:

(suponiendo que tiene interfaz IWeapon y Sword implementa)

IKernel kernel = new StandardKernel();
kernel.Bind<IWeapon>().To<Sword>();
var weapon = kernel.Get<IWeapon>();

Pero Ninject (y la mayoría de los otros frameworks de IoC) pueden hacer cosas más inteligentes, como: digamos que tenemos la clase Warrior que toma IWeapon como parámetro en su constructor. Podemos obtener una instancia de Warrior de Ninject:

var warrior = kernel.Get<Warrior>();

Ninject pasará la implementación IWeapon que especificamos al método constructor Warrior y devolverá la nueva instancia.

Aparte de eso, no conozco ninguna característica en lenguaje que permita este tipo de comportamiento.

Existe un código de magia negra en c # donde se puede definir la implementación predeterminada de una interfaz.

Entonces puedes escribir

var instance = new ISomeInterface();

¿Alguna sugerencia?

ACTUALIZACIÓN 1: Tenga en cuenta que no pregunté si esta es una buena idea. ¿Cómo fue posible hacerlo?

ACTUALIZACIÓN 2: a cualquiera que vea la respuesta aceptada.

  • "Esto debería tratarse simplemente como una curiosidad". de las interfaces "Newing up" de Marc Gravel
  • "Es una mala idea usar una herramienta diseñada para la interoperabilidad COM para hacer algo totalmente diferente. Eso hace que tu código sea imposible de entender para el siguiente tipo que tenga que mantenerlo" de Eric Lippert "Newing up" Interfaces
  • "Si bien puede funcionar, si alguna vez se encontró en el código de producción por un codificador racional, se refactorizaría para usar una clase base o inyección de dependencia". de Stephen Cleary en un comentario a continuación.

Aquí viene la magia negra:

class Program
{
    static void Main()
    {
        IFoo foo = new IFoo("black magic");
        foo.Bar();
    }
}

[ComImport]
[Guid("C8AEBD72-8CAF-43B0-8507-FAB55C937E8A")]
[CoClass(typeof(FooImpl))]
public interface IFoo
{
    void Bar();
}

public class FooImpl : IFoo
{
    private readonly string _text;
    public FooImpl(string text)
    {
        _text = text;
    }

    public void Bar()
    {
        Console.WriteLine(_text);
    }
}

Tenga en cuenta que no solo puede instanciar una interfaz sino también pasar argumentos a su constructor :-)







interface