私はC#で継承を少し新しくしました。私は基底クラスVector.cs
を継承する2つのクラスVelocity.cs
とPosition.cs
を持っています。私は、Velocity.cs
とPosition.cs
からアクセス可能なVector.cs
の中にsubtract()
というメソッドを作成しようとしています。C#継承の型キャストエラー
ここでは、減算のコードを示します。
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);
私はが明示的に「速度」と「ベクトル」の間の変換はできませんというエラーを取得しますあなたはキャストを忘れましたか? タイプの未処理の例外「System.InvalidCastExceptionの」どのように私はこの仕事をするためにこの機能を書き換えることができ
を発生しました:
は、だから私は、次のエラーの結果があることがVelocity result = (Velocity)v1.subtract(v2);
を試してみましたか?戻り値の型を持つ関数の3つのバージョンを実際に作成する必要がありますかVector
Velocity
とPosition
?もしそうなら、継承のポイントは何ですか?私はそれらを関連するクラスに入れることができます。
注:ベロシティクラスはちょっと小さく、当時は無意味に思えるかもしれませんが、私はそれを後でさらに追加します。私はプロジェクトの途中です。
サイドノート、ありません'新しいランダム()...、新しいランダム()...'を実行します。代わりに、Randomクラスの静的インスタンスを作成し、その代わりに使用します。それ以外の場合は、同じ番号を頻繁に使用します。 – pinkfloydx33
また、subtractメソッドは 'Vector'を返します。それをタイプVelocityの変数に割り当てようとしています。 'Velocity'が' Vector'であることは事実ですが、 'Vector'は必ずしも' Velocity'( 'Position'でもよい)であるとは限りません。あなたはいつでも 'Vector result = v1.subtract(v2);'を実行することができますが、 'Vector'で定義されている共通フィールドにしかアクセスできません。もう一つの副作用:C#命名規則に従って、メソッド名は大文字、すなわち 'Change(...)'と 'Subtract(...)'で始めるべきです。 – pinkfloydx33
最初の回答者のアプローチが気に入っています。 BTWは私を二重チェックします...私はそれがあなたがより簡単な方法で望むものと一致すると信じています。 –