【问题标题】:Accessing a Class property without using dot operator在不使用点运算符的情况下访问 Class 属性
【发布时间】:2012-02-29 05:35:10
【问题描述】:

当使用 Double 类型调用时,我需要重载一些运算符。为此,我创建了一个继承自 Double 的类 MyDouble。 MyDouble 看起来有点像这样

class MyDouble : Double
{
   Double value;
   // operator overloads go here
}

我想从用户那里抽象出 value 属性,以便它可以像 Double 一样使用。基本上我希望用户能够做到这一点:

MyDouble a = 5;         //a.value gets assigned 5
Console.WriteLine(a);   //prints a.value

我不希望用户必须专门针对 value 属性。这可能吗?我该怎么办?

【问题讨论】:

  • 不是很清楚你的目的,重写ToString函数?
  • 例如,假设我想重载< 运算符。因此,如果您使用二元运算符<,我的重载定义将决定返回结果。
  • MyDouble 继承的这个“Double”类是什么?它不能是 System.Double,因为那是一个值类型,而值类型是隐式密封的。
  • 是的,我以为我可以从 System.Double 派生,但意识到这是不可能的。

标签: c# oop operator-overloading


【解决方案1】:

您可以定义一个隐式转换运算符,如下所示:

class MyDouble {
    public Value {get; private set;}
    public Double(double value) {
        Value = value;
    }
    // Other declarations go here...
    public static implicit operator double(MyDouble md) {
        return md.Value;
    }
    public static implicit operator MyDouble(double d) {
        return new MyDouble(d);
    }
}

【讨论】:

  • 这似乎正是我所需要的。赞成和实施。我会回来接受的。谢谢!
  • 这并不完全符合我的预期。如果我做Mydouble a = 5.0,我希望用a.value = 5 创建一个MyDouble a 的实例,但是我得到一个'不能隐式地将类型double 转换为MyDouble'。好像我没有重载正确的运算符。
  • 知道了。这解决了这个问题。谢谢
  • 这是怎么回事?您如何从值类型继承?
  • 我添加了一个后续问题,以防你想看看stackoverflow.com/questions/9494871/…
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 2017-09-10
  • 1970-01-01
  • 2016-11-23
  • 2013-05-10
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多