C# 在不复制派生类构造函数的情况下初始化基类

C# 在不复制派生类构造函数的情况下初始化基类,c#,inheritance,constructor,C#,Inheritance,Constructor,我需要从类工具派生,因为我必须用另一个接口IToolWrapper装饰该类。不幸的是,Tool类没有提供一个复制构造函数,这就是为什么我认为不能像这样编写DerivedTool的构造函数 public DerivedTool(String filename) : base(createToolFromFile(filename)) { //... } 虽然我很确定它不会起作用,但我尝试了以下方法: public sealed class DerivedTool : Tool, IToo

我需要从类
工具
派生,因为我必须用另一个接口
IToolWrapper
装饰该类。不幸的是,
Tool
类没有提供一个复制构造函数,这就是为什么我认为不能像这样编写
DerivedTool
的构造函数

public DerivedTool(String filename) : base(createToolFromFile(filename)) {
    //...
}
虽然我很确定它不会起作用,但我尝试了以下方法:

public sealed class DerivedTool : Tool, IToolWrapper {

    static bool createToolFromFile(ref Tool tool, String filename) {
        tool.Dispose();
        tool = null;
        try {
            tool = LoadFromFile(filename) as Tool;
        } catch ( Exception ) {
            return false;
        }
        return true;
    }

    public DerivedTool(String filename) : base() {
        Tool tool = (Tool)this;
        if ( !createToolBlockFromFile(ref tool, filename) ) throw new Exception("Tool could not be loaded!");
    }

}
在调试器中,我看到构造函数的
tool
as I局部变量根据需要进行了修改(b/c未输入catch case),但
DerivedTool
的基本部分(即
tool
)不受影响。
如何实现所需的行为?

使用私有变量和隐式/显式运算符的组合,如下所示:

public sealed class DerivedTool : IToolWrapper {
    private Tool _tool;

    public DerivedTool(String filename) : base() {
        _tool = LoadFromFile(filename) as Tool;
    }

    public static implicit operator Tool(DerivedTool dt)
    {
        return dt._tool;
    }
}

使用私有变量和隐式/显式运算符的组合,如下所示:

public sealed class DerivedTool : IToolWrapper {
    private Tool _tool;

    public DerivedTool(String filename) : base() {
        _tool = LoadFromFile(filename) as Tool;
    }

    public static implicit operator Tool(DerivedTool dt)
    {
        return dt._tool;
    }
}

使用私有变量和隐式/显式运算符的组合,如下所示:

public sealed class DerivedTool : IToolWrapper {
    private Tool _tool;

    public DerivedTool(String filename) : base() {
        _tool = LoadFromFile(filename) as Tool;
    }

    public static implicit operator Tool(DerivedTool dt)
    {
        return dt._tool;
    }
}

使用私有变量和隐式/显式运算符的组合,如下所示:

public sealed class DerivedTool : IToolWrapper {
    private Tool _tool;

    public DerivedTool(String filename) : base() {
        _tool = LoadFromFile(filename) as Tool;
    }

    public static implicit operator Tool(DerivedTool dt)
    {
        return dt._tool;
    }
}

我们无法比您更好地了解
CogToolBlock
类的工作原理,除非我们对它有更多了解。为什么不创建另一个类,在构造函数中获取工具实例,并通过将操作转发到提供的工具实例来实现接口?您是否需要使用新类作为开箱即用工具的替代品,例如,将其交给以工具为参数的方法?@Matz:问题并不十分清楚。。。请您详细解释一下,以便我们能为您提供完美的解决方案。我的意图是(i)向
工具添加
IToolWrapper
方法,以及(ii)同时能够使用
DerivedTool
代替
工具。由于
工具
中缺少复制构造函数,直接继承似乎不可能。然而,Farzan的解决方案是有效的。我们无法比您更好地了解
CogToolBlock
类的工作原理,除非我们对它有更多的了解。您为什么不创建另一个类,在构造函数中获取一个工具实例,并通过将操作转发到提供的工具实例来实现接口?您是否需要使用新类作为开箱即用工具的替代品,例如,将其交给以工具为参数的方法?@Matz:问题并不十分清楚。。。请您详细解释一下,以便我们能为您提供完美的解决方案。我的意图是(i)向
工具添加
IToolWrapper
方法,以及(ii)同时能够使用
DerivedTool
代替
工具。由于
工具
中缺少复制构造函数,直接继承似乎不可能。然而,Farzan的解决方案是有效的。我们无法比您更好地了解
CogToolBlock
类的工作原理,除非我们对它有更多的了解。您为什么不创建另一个类,在构造函数中获取一个工具实例,并通过将操作转发到提供的工具实例来实现接口?您是否需要使用新类作为开箱即用工具的替代品,例如,将其交给以工具为参数的方法?@Matz:问题并不十分清楚。。。请您详细解释一下,以便我们能为您提供完美的解决方案。我的意图是(i)向
工具添加
IToolWrapper
方法,以及(ii)同时能够使用
DerivedTool
代替
工具。由于
工具
中缺少复制构造函数,直接继承似乎不可能。然而,Farzan的解决方案是有效的。我们无法比您更好地了解
CogToolBlock
类的工作原理,除非我们对它有更多的了解。您为什么不创建另一个类,在构造函数中获取一个工具实例,并通过将操作转发到提供的工具实例来实现接口?您是否需要使用新类作为开箱即用工具的替代品,例如,将其交给以工具为参数的方法?@Matz:问题并不十分清楚。。。请您详细解释一下,以便我们能为您提供完美的解决方案。我的意图是(i)向
工具添加
IToolWrapper
方法,以及(ii)同时能够使用
DerivedTool
代替
工具。由于
工具
中缺少复制构造函数,直接继承似乎不可能。然而,法赞的解决方案是可行的。这听起来很合理,在我的案例中也有效。谢谢。对我来说,这听起来很合理而且有效。谢谢。对我来说,这听起来很合理而且有效。谢谢。对我来说,这听起来很合理而且有效。谢谢