【问题标题】:overloading operator c# Vector重载运算符 c# Vector
【发布时间】:2015-06-25 19:11:04
【问题描述】:

所以,我试图重写 c# 中的“-”运算符,以便能够减去 2 个向量,但我的类无法实现 Vector。

namespace Vectors
{
    class VectorUtilv
    {
        private Point _p;
        private Point _p2;
        private Vector _v;


         public Vector V
        {
            get { return _v; }
            set { _v = value; }
        }

        public Point AddVector(Vector v)
        {
            _p.X = (_p.X + v.X);
            _p2.Y = (_p.Y + v.Y);

            return _p2;
        }

        // This is where I am trying to override but I cant add the v.X or 
        // the v.Y because it is not a vector. If i cast it as a vector the 
        // override doesn't work.
        //////////////////////////////////////////////////////////////////
        public static VectorUtilv operator -(Vector a, Vector b)
        {
            Vector v = new Vector();
            v.X = a.X - b.X;
            v.Y = a.Y - b.Y;
            return v;
        }
    }    
}

知道如何解决这个问题吗?

【问题讨论】:

  • 附带说明,如果 vector 是一个类,您可以直接将其 inerithed 并覆盖 - 运算符。但是,vector 是一个结构体,它们不能被继承。更多信息在这里:stackoverflow.com/questions/1222935/…
  • 使用Vector.Subtract而不是使用运算符。

标签: c# vector operator-keyword


【解决方案1】:

因为您正在尝试为类定义运算符。至少其中一个参数应在具有类类型的运算符中使用。例如,您不能拥有 Car 类并定义 Operator 女巫只获取 int

您不能覆盖现有类的运算符。只能覆盖您自己的类。

如果你不能修改 Vector 类,那么你应该声明你自己的名为 Vector 的类。或使用您的类的类型作为运算符。

所以你可以拥有

    class VectorUtilv
    {
        private Point _p;
        private Point _p2;
        private Vector _v;
        public static VectorUtilv operator -(VectorUtilv a, VectorUtilv b)
        {
            //...
        }
    }

    class Vecotr
    {
        private Point _p;
        private Point _p2;
        private Vector _v;
        public static Vecotr operator -(Vecotr a, Vecotr b)
        { 
            //...
        }
    }

但是如果您使用解决方案 2。那么您需要在使用 Vector 时使用限定符。

System.Windows.Vector // is in Windows assembly
Vector // is your class

【讨论】:

    【解决方案2】:

    您只能覆盖其自己类中的运算符。

    将所有代码移至Vector 类。

    【讨论】:

    • 但我认为他做不到,因为 Vector 在 System.Windows 程序集中,无法修改
    • @M.kazemAkhgary:那他倒霉了。
    • 是的。我们还内置了Vector.Subtract(v1,v2) 方法来执行减法。
    【解决方案3】:

    在您的矢量类中,覆盖其中的“-”运算符

    public class Vector
    {
        public int X { get; set; }
        public int Y { get; set; }
    
        public static Vector operator -(Vector a, Vector b)
        {
            Vector v = new Vector();
            v.X = a.X - b.X;
            v.Y = a.Y - b.Y;
            return v;
        }
    }
    

    然后,你可以这样使用它

    Vector v1 = new Vector { X = 5, Y = 9};
    Vector v2 = new Vector { X = 3, Y = 4 };
    Vector vr = v1 - v2;
    Console.WriteLine("Resultant Vector X: {0} & Y:{1}", vr.X, vr.Y);
    

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      感谢您的好评。我希望我能在弄清楚之前检查一下。会为我节省很多时间。我最终完全按照你们所说的做了。这是我所拥有的。

      公共静态 VectorUtil 运算符 -(VectorUtil aHeroPoint, VectorUtil bEnemyPoint) { VectorUtil v = new VectorUtil(); v.Vec = new Vector((aHeroPoint._p.X - bEnemyPoint._p.X),(aHeroPoint._p.Y - bEnemyPoint._p.Y)); 返回 v; }

      【讨论】:

        猜你喜欢
        • 2013-01-03
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        • 2011-05-03
        • 2018-12-16
        • 2016-02-19
        • 1970-01-01
        相关资源
        最近更新 更多