首页 > 解决方案 > 如何从基类引用派生类型?

问题描述

问题“?”有关键字吗?在下面标记或不使用模板达到相同效果的方法?

abstract class A
{
    public abstract void Attach(? x);
}

class B : A
{
    public override void Attach(B b) {}
}

class C : A
{
    public override void Attach(C c) {}
}

以便:

var b1 = new B();
var b2 = new B();

var c = new C();

b1.Attach(b2);
b1.Attach(c); // should not compile

编辑:对于模板,我的意思是类型参数,例如Attach<T>(T x, T y)// 如果我们忽略该示例采用 1 个参数

标签: c#oop

解决方案


恼人的是,没有。您可以获得的最接近的是:

abstract class A<T> where T : A<T>
{
    public abstract void Attach(T x);
}

class B : A<B>
{
    public override void Attach(B b) { }
}

class C : A<C>
{
    public override void Attach(C c) { }
}

然而,这并不能阻止某人写作:

class D : A<B>
{
    ...
}

如果你想避免这种情况,你需要在's 的构造函数中进行运行时检查this.GetType() == typeof(T)或类似的检查。A


推荐阅读