首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >枚举“继承”

枚举“继承”
EN

Stack Overflow用户
提问于 2009-04-16 19:27:08
回答 10查看 281.3K关注 0票数 442

我在低级命名空间中有一个枚举。我想在“继承”低级枚举的中级命名空间中提供一个类或枚举。

代码语言:javascript
复制
namespace low
{
   public enum base
   {
      x, y, z
   }
}

namespace mid
{
   public enum consume : low.base
   {
   }
}

我希望这是可能的,或者是某种类型的类,它可以代替枚举使用者,它将为枚举提供一个抽象层,但仍然允许该类的实例访问枚举。

有什么想法?

编辑:我没有在类中将其切换为const的原因之一是,我必须使用的服务需要低级枚举。我得到了WSDL和XSD,它们将结构定义为枚举。无法更改该服务。

EN

回答 10

Stack Overflow用户

发布于 2009-04-16 19:36:39

简短的回答是否定的。你可以玩一下,如果你想的话:

你总是可以这样做的:

代码语言:javascript
复制
private enum Base
{
    A,
    B,
    C
}

private enum Consume
{
    A = Base.A,
    B = Base.B,
    C = Base.C,
    D,
    E
}

但是,它并不能很好地工作,因为Base.A != Consume.A

不过,您始终可以这样做:

代码语言:javascript
复制
public static class Extensions
{
    public static T As<T>(this Consume c) where T : struct
    {
        return (T)System.Enum.Parse(typeof(T), c.ToString(), false);
    }
}

为了在基础和消费之间穿梭...

您还可以将枚举的值转换为整数,并将它们作为整数而不是枚举进行比较,但这也很糟糕。

扩展方法返回的类型应该转换为T类型。

票数 128
EN

Stack Overflow用户

发布于 2010-10-28 20:19:23

上面使用带有int常量的类的解决方案缺乏类型安全性。也就是说,你可以创造出实际上没有在类中定义的新值。此外,例如,不可能编写一个将这些类中的一个作为输入的方法。

您需要编写以下代码

代码语言:javascript
复制
public void DoSomethingMeaningFull(int consumeValue) ...

然而,过去的Java有一个基于类的解决方案,当时没有可用的枚举。这提供了一种几乎类似枚举的行为。唯一需要注意的是,这些常量不能在switch-语句中使用。

代码语言:javascript
复制
public class MyBaseEnum
{
    public static readonly MyBaseEnum A = new MyBaseEnum( 1 );
    public static readonly MyBaseEnum B = new MyBaseEnum( 2 );
    public static readonly MyBaseEnum C = new MyBaseEnum( 3 );

    public int InternalValue { get; protected set; }

    protected MyBaseEnum( int internalValue )
    {
        this.InternalValue = internalValue;
    }
}

public class MyEnum : MyBaseEnum
{
    public static readonly MyEnum D = new MyEnum( 4 );
    public static readonly MyEnum E = new MyEnum( 5 );

    protected MyEnum( int internalValue ) : base( internalValue )
    {
        // Nothing
    }
}

[TestMethod]
public void EnumTest()
{
    this.DoSomethingMeaningful( MyEnum.A );
}

private void DoSomethingMeaningful( MyBaseEnum enumValue )
{
    // ...
    if( enumValue == MyEnum.A ) { /* ... */ }
    else if (enumValue == MyEnum.B) { /* ... */ }
    // ...
}
票数 103
EN

Stack Overflow用户

发布于 2009-04-16 19:44:42

忽略base是保留字的事实,您不能继承枚举。

你能做的最好的事情就是这样:

代码语言:javascript
复制
public enum Baseenum
{
   x, y, z
}

public enum Consume
{
   x = Baseenum.x,
   y = Baseenum.y,
   z = Baseenum.z
}

public void Test()
{
   Baseenum a = Baseenum.x;
   Consume newA = (Consume) a;

   if ((Int32) a == (Int32) newA)
   {
   MessageBox.Show(newA.ToString());
   }
}

由于它们都是相同的基类型(例如: int),您可以将一个类型的实例的值赋给另一个类型,即强制转换。不是很理想,但它是有效的。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/757684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档