0

我有以下 Windows 运行时解决方案设置:

在我的 EXE 引用的 DLL 中

public abstract class BaseClass {

    public BaseClass(Guid id, string name) {
        //...
    }

}

在EXE中

public sealed class DerivedClass : BaseClass {

}

在 DLL 中,还有另一个类使用BaseClass在运行时指定的子类型。我想既然基类有构造函数,我就可以像这样实例化它:

//this._userType holds the type of DerivedClass
BaseClass foo = (BaseClass)Activator.CreateInstance(this._userType, id, name);

但是,它告诉我找不到构造函数。所以我去找了其他答案,说我可以使用Type'GetConstructor()方法,但这似乎在 WinRT 中不存在。有一个DeclaredConstructors属性,但它只列出在DerivedClass. DerivedClass除了这个特定的构造函数之外不需要做任何事情BaseClass,所以我不想只写一个调用的显式构造函数,base但如果这是唯一的选择,那么让我知道(我确认这种方法有效)。

4

1 回答 1

2

在 C# 超类构造函数中,派生类不会自动继承类。假设您有一个带有构造函数的超类:

public class BaseClass
{

    public BaseClass(Guid id, string name)
    {
        //...
    }

}

如果您没有在派生类上声明具有相同参数集的构造函数,它将无法用于它。您需要从派生类构造函数调用超类构造函数以使其可用:

public sealed class DerivedClass : BaseClass
{
    public DerivedClass(Guid id, string name) 
        : base(id, name)
    { }
}

此外,派生类构造函数总是需要调用超类构造函数。如果你有一个无参数的超类构造函数,你不需要显式调用它,因为它会被自动调用。但是请记住,总是会隐式调用无参数构造函数,而不是具有匹配参数的构造函数。在所有其他情况下,您需要使用上述语法显式调用选定的超类构造函数。

另一点值得一提的是,抽象类实际上并不需要公共构造函数,因为它们只能从其派生类中调用,因为抽象类不能直接实例化。这意味着你真的应该制作它们protected。编译器不会抱怨,但如果您在抽象类上有公共构造函数,大多数样式检查工具都会发出警告。

最后一件事:除非绝对必要,否则您确实应该避免使用反射。它会影响性能并破坏类型安全,即您将在运行时而不是在编译时出现错误。

于 2013-08-09T04:57:47.200 回答