首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用基于接口的开发时重载按位运算符

在使用基于接口的开发时重载按位运算符
EN

Stack Overflow用户
提问于 2009-10-15 04:59:15
回答 3查看 493关注 0票数 1

使用C# 3.0、.NET 3.5

我需要一个比简单数字更智能的枚举。我已经使用静态类和属性解决了这个问题,但我缺少的一件事是,在不访问特定属性的情况下,可以像使用位标志一样使用枚举。

例如,这是可行的:

代码语言:javascript
复制
public interface isomething
{
int value { get; }
}

public class something : isomething
{
public int value {get; private set;}

public somthing(int value)
{
this.value = value
}

public void DoSomething()
{
throw new NotImplementedException();
}
}

public static class SuperEnum
{
public static isomething first = new something(1);
public static isomething second= new something(2);
}

然后执行下面这样的代码:

代码语言:javascript
复制
Assert.IsTrue((SuperEnum.first.value | SuperEnum.second.value) == 3);

你会得到一个真的。但是如果我将这个添加到something类中:

代码语言:javascript
复制
public static int operator | (something leftSide, isomething rightside)
{
return leftside.value | rightside.value
}

然后执行下面这样的代码:

代码语言:javascript
复制
Assert.IsTrue((SuperEnum.first | SuperEnum.second) == 3);

我得到了一条消息:|运算符不能用于isomething类型,这很糟糕。

如果我使用具体的类型,我很好,但这将在未来带来问题。

有人有什么想法吗?

谢谢,马克

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-15 05:25:22

我不确定你想要达到什么目的。我认为这个问题可能有更好的解决方案,但如果运算符很重要,你可以使用抽象类而不是接口来实现:

代码语言:javascript
复制
public abstract class SomethingBase
{
    protected int value;

    protected SomethingBase(int value)
    {
        this.value = value;
    }

    public static int operator |(SomethingBase leftSide, SomethingBase rightside)
    {
        return leftSide.value | rightside.value;
    }
}

public class Something : SomethingBase
{
    public int Value
    {
        get { return value; }
    }

    public Something(int value) : base(value)
    {
    }

    public void DoSomething()
    {
        throw new NotImplementedException();
    }
}
票数 1
EN

Stack Overflow用户

发布于 2009-10-15 05:04:37

您的问题来自于这样一个事实:ISomething接口没有声明操作符,我不确定您是否可以将操作符作为接口契约的一部分。使用具体类会导致什么类型的问题?

票数 1
EN

Stack Overflow用户

发布于 2009-10-15 05:22:51

如果你在做二进制数学运算,听起来就像是在谈论一个值。如果您正在谈论一个值,那么不可变的具体类型将是一个很好的选择(可能是struct,具体取决于大小)。如果你有一个具体的类型,你可以添加一个定制的操作符。

或者,您可以向接口添加一个Or方法(或添加一个扩展方法来执行相同的操作),但这可能涉及到第一个操作数选择具体类型……但话说回来,我不确定界面到底添加了什么。

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

https://stackoverflow.com/questions/1570348

复制
相关文章

相似问题

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