【发布时间】:2017-02-05 15:20:07
【问题描述】:
我对 C# 中的继承有点陌生。我有两个类Velocity.cs 和Position.cs 继承自基类Vector.cs。我正在尝试在Vector.cs 中创建一个名为subtract() 的方法,该方法可以从Velocity.cs 和Position.cs 访问。
这是减法的代码。
public Vector subtract(Vector v) {
double nx = this.x - v.x;
double ny = this.y - v.y;
double mag = Math.Sqrt(x * x + y * y);
double ang = Math.Atan2(y, x);
return new Vector(mag, ang);
}
定义Velocity.cs类的代码如下。
class Velocity : Vector{
public Velocity(Position p1, Position p2, double vpref) : base(p1, p2) {
normalize();
scale(vpref);
}
public Velocity(double vmax) : base(new Random().NextDouble()*vmax, new Random().NextDouble()*2*Math.PI) {
}
public void change(Velocity v) {
x = v.x;
y = v.y;
magnitude = Math.Sqrt(x * x + y * y);
angle = Math.Atan2(y, x);
}
}
}
当我尝试在外部调用减法函数时,如下所示:
Velocity v1 = new Velocity(5);
Velocity v2 = new Velocity(7);
Velocity result = v1.subtract(v2);
我收到一条错误消息,提示 无法在“Velocity”和“Vector”之间显式转换你忘记了演员表吗?
所以我尝试了Velocity result = (Velocity)v1.subtract(v2);,但这会导致以下错误:发生了“System.InvalidCastException”类型的未处理异常
我怎样才能重写这个函数来使它工作?我真的必须制作返回类型为VectorVelocity 和Position 的函数的三个版本吗?如果是这样,继承的意义何在?我可以把它们放在相关的类中。
注意:我知道速度等级有点小,当时可能看起来毫无意义,我稍后会添加更多内容,我正在做一个项目。
【问题讨论】:
-
旁注,不要这样做
new Random()..., new Random()...。相反,创建 Random 类的静态实例并使用它。否则你会经常得到相同的数字。 -
另外,您的减法方法返回一个
Vector。您正在尝试将其分配给Velocity类型的变量。虽然Velocity确实是Vector,但Vector不一定是Velocity(它可以是Position)。您始终可以使用Vector result = v1.subtract(v2);,但您只能访问Vector中定义的公共字段,这取决于您的用例,这可能不够,也可能不够。另一个注意事项:根据 C# 命名约定,方法名称应以大写字母开头,即Change(...)和Subtract(...)。 -
我看到你喜欢第一个回答者的方法。顺便说一句,请仔细检查我的……我相信它以更直接的方式符合您的要求。
标签: c# oop inheritance casting