Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用不同的枚举重写基类中的函数_C#_Enums_Derived Class - Fatal编程技术网

C# 使用不同的枚举重写基类中的函数

C# 使用不同的枚举重写基类中的函数,c#,enums,derived-class,C#,Enums,Derived Class,好的,标题听起来可能有点混乱,请阅读我的解释,理解我的意思: 我得到了一个基类,我们称它为BaseProvider。该类如下所示: public abstract class BaseProvider { public abstract void NewItem(int type); } 现在,我添加了从BaseProvider派生的第二个类。我们将其称为TestProvider: public class TestProvider : BaseProvider { publi

好的,标题听起来可能有点混乱,请阅读我的解释,理解我的意思:

我得到了一个基类,我们称它为
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
。不过,如果能够使用enum,那就更好了。由于每个数据提供者都有一组不同的子类型,我不能重用已经存在的子类型。 现在,我的方法签名必须与基类中的签名完全匹配,这使得不可能将参数类型更改为枚举(即使枚举基本上是int)

我确实尝试定义我的派生类,如下所示:

public class TestProvider : BaseProvider
{
    public override void NewItem(MyEnum type)
    {

    }
}

enum MyEnum : int
{
    TEST = 1
}
恕我直言,这不起作用……
所以我现在的问题是:


是否可以使用从基类中定义的参数类型派生的不同参数类型覆盖基函数?如果是,怎么做?不,绝对不是-下面是原因。。。此代码仍然必须工作:

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)
    {
    }
}
公共抽象类BaseProvider
{
公共摘要无效项(T型);
}
公共类TestProvider:BaseProvider
{
公共重写void NewItem(MyEnum类型)
{
}
}

不,绝对不是——这就是为什么。。。此代码仍然必须工作:

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)
    {
    }
}
公共抽象类BaseProvider
{
公共摘要无效项(T型);
}
公共类TestProvider:BaseProvider
{
公共重写void NewItem(MyEnum类型)
{
}
}

您实际上忽略了此处重写的概念。这与更改方法定义无关。它是关于改变方法行为的。您可以在这里执行重载操作,或者确保在调用之前将
enum
强制转换为
int

您实际上忽略了在这里重写的概念。这与更改方法定义无关。它是关于改变方法行为的。您可以在这里做的是重载,或者确保在调用之前将
enum
强制转换为
int

这实际上是有道理的,但是有人告诉我这应该是可能的,并且他们在代码中的某个地方这样做了。不过我不确定:)@RononDex:嗯,你需要和他们谈谈他们到底做了什么。。。但正如你所写的那样,这是无法编译的。事实上,如果你仔细想想,这在理论上是可能的。NET运行时应该能够将通过TestProvider.NewItem传递给函数的int解析为相应的枚举值,因为枚举基本上只是一个整数。@RononDex:不,语言禁止它。该语言本来可以设计为允许这类事情,但它的设计目的是将枚举与
int
分开。这使得它更安全,除了其他。因此,考虑到实际的语言设计,与您交谈的人是错误的。这实际上是有道理的,但是有人告诉我这应该是可能的,并且他们在代码中的某个地方这样做了。不过我不确定:)@RononDex:嗯,你需要和他们谈谈他们到底做了什么。。。但正如你所写的那样,这是无法编译的。事实上,如果你仔细想想,这在理论上是可能的。NET运行时应该能够将通过TestProvider.NewItem传递给函数的int解析为相应的枚举值,因为枚举基本上只是一个整数。@RononDex:不,语言禁止它。该语言本来可以设计为允许这类事情,但它的设计目的是将枚举与
int
分开。这使得它更安全,除了其他。因此,考虑到实际的语言设计,与你交谈的人是错误的。