抽象类构造函数可以实例化一个新对象吗?

时间:2014-07-02 20:04:30

标签: c# inheritance abstract

我有一组服务注入我的控制器。我的抽象类构造函数可以实例化常用对象的新实例吗?

public class ReportService : AReportService, IReportService
{
    private readonly IMyService _myservice;
    public ReportService(IMyService myService) : base ()
    {
        _myservice = myService;
    }

    public void MyMethodForThisService(string someProperty)
    {
        _parentService.DoSomething(someProperty);
    }
}

public abstract class AReportService
{
    protected readonly ParentService _parentService;
    protected AReportService()
    {
        _parentService = new ParentService();
    }

    protected void MyFirstSharedMethodForAllServices(string someProperty)
    {
        _parentService.DoSomethingElse(someProperty);
    }
}

2 个答案:

答案 0 :(得分:5)

  

我的抽象类构造函数可以实例化常用对象的新实例吗?

绝对。抽象类的构造函数基本上可以完成普通构造函数所能做的任何事情。唯一的限制是你只能调用构造函数作为从另一个构造函数链接的一部分。

答案 1 :(得分:4)

Jon Skeet(像往常一样)是正确的 - 你可以这样做。但是,由于您使用子控制器遵循依赖注入模式,因此您也应该为父类使用依赖注入。

您可以通过将依赖项注入父级构造函数来实现此目的,但是您可能已经注意到需要所有子类注入相同的对象并执行传递,这可以获得在添加更多依赖项时很烦人。

或者,您可以执行Property Injection,但这样可以轻松忘记使用需要注入的新属性更新单元测试。

作为妥协,我经常使用方法注入,其中基类具有" InjectDependencies"初始化依赖项的方法。不幸的是,这不允许您将依赖项设置为只读,并且仍然可以在不提供依赖项的情况下构造对象。

最后一个选项是创建一个特殊类,仅用于包含父类的依赖项,然后将类注入父类的构造函数中。然后,子类只需要将一个参数传递给父构造函数,并且您将来可以自由添加依赖项,这不会影响子类,但会提示尝试构造依赖项对象的单元测试。手。

在您应该使用合成的情况下,您还应该仔细考虑是否使用继承。 MyFirstSharedMethodForAllServices()只是您碰巧知道几种服务会使用的便捷方法吗?为什么不用这个方法创建一个单独的类,所有这些服务都可以注入?这将为您提供更大的灵活性,例如,单独测试MyFirstSharedMethodForAllServices()。它还可以让您的服务免费扩展其他课程,这是基于更多"风格的关系。