好的,标题可能听起来有点令人困惑,只是在这里阅读我的解释以理解我的意思:
我有一个基类,我们称之为BaseProvider
。这个类看起来像这样:
public abstract class BaseProvider
{
public abstract void NewItem(int type);
}
现在我添加了一个派生自BaseProvider
的第二个类。让我们称之为TestProvider
:
public class TestProvider : BaseProvider
{
public override void NewItem(int type)
{
}
}
好的,现在我的问题/问题出现了:
由于此提供程序应该能够处理不同的子类型,因此我创建了参数int type
。但是,能够使用Enums会更好。由于每个数据提供者都有一组不同的子类型,我无法重用已有的子类型。
现在我的方法签名必须与基类完全匹配,这使得无法将参数类型更改为枚举(即使枚举基本上是一个int)。
我确实尝试定义我的派生类,如下所示:
public class TestProvider : BaseProvider
{
public override void NewItem(MyEnum type)
{
}
}
enum MyEnum : int
{
TEST = 1
}
如果感到沮丧,这不起作用...... 所以现在我的问题是:
是否可以使用从基类中定义的参数类型派生的不同参数类型覆盖基本函数?如果是,如何?
答案 0 :(得分:4)
不,绝对没有 - 这就是为什么......这段代码仍然有效:
BaseProvider provider = new TestProvider();
provider.NewItem(10);
这只是多态性的正常要求。在覆盖时不能更改签名,因为调用者可能正在考虑基类的实例。 (事实上,如果他们不这样做,为什么还要抽象使用抽象方法呢?)
现在你可以重载方法:
public override void NewItem(int type)
{
NewItem((MyEnum) type);
}
public void NewItem(MyEnum type)
{
...
}
这不是一回事,但它可能达到你想要的效果。
或者,您可以BaseProvider
通用:
public abstract class BaseProvider<T>
{
public abstract void NewItem(T type);
}
public class TestProvider : BaseProvider<MyEnum>
{
public override void NewItem(MyEnum type)
{
}
}
答案 1 :(得分:1)
你实际上错过了覆盖的概念。它不是要改变方法定义。它是关于改变方法行为。你在这里可以做的就是超载,或者确保你在调用前将你的enum
转换为int
。