代码之家  ›  专栏  ›  技术社区  ›  Simon Randy Burden

如何在c#中定义接口的默认实现?

  •  29
  • Simon Randy Burden  · 技术社区  · 14 年前

    所以你可以写

    var instance = new ISomeInterface();
    

    有什么建议吗?

    更新1:请注意,我没有问这是不是一个好主意。这是怎么可能的。

    • “这应该仅仅当作一种好奇心来对待。”来自马克·格拉斯 "Newing up" Interfaces
    • “更新”界面
    • Stephen Cleary在下面的一篇评论中写道:“虽然它可以工作,但如果rational编码器在生产代码中发现了它,它将被重构为使用基类或依赖注入。”。
    3 回复  |  直到 6 年前
        1
  •  34
  •   Darin Dimitrov    14 年前

    黑魔法来了:

    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);
        }
    }
    

    请注意,不仅可以实例化接口,还可以将参数传递给其构造函数:-)

        2
  •  3
  •   Stephen Cleary    14 年前

    ISomeInterface 是一个班级。

    更新(澄清):

    a talk 他提到了接口的默认实现。不过,它们不是C语言的一部分。谈话是关于乔恩·斯基特会做什么 在C#的未来版本中查看。

    目前,唯一的默认实现是通过 abstract )基类。

        3
  •  1
  •   arikfr Jacob    14 年前

    也许你指的是依赖注入?当使用DI框架时(例如 Ninject

    (假设你有 IWeapon 接口和 Sword

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

    Warrior 它将IWeapon作为其构造函数中的参数。我们可以得到一个 战士 来自Ninject:

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

    战士 方法并返回新实例。