具有类Base
和类Derived : Base
,以及如何实现功能
void Foo(Base obj) { } // Must be restricted to Base type
此代码的编译位置
var obj = new Base();
Foo(obj);
但是此代码不是吗?
var obj = new Derived();
Foo(obj);
答案 0 :(得分:0)
我认为您无法在C#中做到这一点。
但是您可以检查方法中的参数类型并执行所需的操作。 Fiddle
public static void Main(string[] args)
{
var derived = new Derived();
var b = new Base();
D(derived); //Derived
D(b); //Base
}
public static void D(Base base)
{
Console.WriteLine(base.GetType());
}
答案 1 :(得分:0)
您不能将方法限制为仅在编译时接受特定类型的参数,除非该类型为sealed
。实际上,这将打破任何面向对象的原则,因为派生类型的实例始终是基类的实例。另一方面,您的Foo
方法根本不需要关心它,因为它不知道任何派生类型。它得到的只是一个Base
类型的参数,该参数可以或不能是派生类型。
在运行时,您当然可以获取实际的类型并针对Derived
抛出异常:
public void Foo(Base @base)
{
if(@base.GetType() != typeof(Base))
throw new NotSupportedException("must be of type Base");
}
顺便说一句:base
是保留关键字,不能用作变量的名称。因此,我将逐字(@
)添加到了代码中。