Я немного новичок в наследовании на C#. У меня есть два класса Velocity.cs
и Position.cs
, которые наследуют от базового класса Vector.cs
. Я пытаюсь создать метод subtract()
внутри Vector.cs
, который будет доступен от Velocity.cs
и Position.cs
.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);
}
}
}
Когда я пытаюсь вызвать функцию Subtract снаружи, что-то вроде этого:
Velocity v1 = new Velocity(5);
Velocity v2 = new Velocity(7);
Velocity result = v1.subtract(v2);
Я получаю сообщение об ошибке говорящее Не можете явно конвертировать между 'Velocity' и 'Вектор' Вы забыли бросок?
Так что я попытался Velocity result = (Velocity)v1.subtract(v2);
однако, что приводит к следующей ошибке: необработанного исключения типа «System.InvalidCastException» произошло
Как я могу переписать эту функцию, чтобы сделать эту работу? Должен ли я действительно делать три версии функции с типами возврата Vector
Velocity
и Position
? Если да, то в чем смысл наследования? Я мог бы просто поместить их в свой класс.
Примечание: Я знаю, что класс скорости немного мал и может казаться бессмысленным в то время, я добавлю его позже, я в середине проекта.
Примечание стороны, не do 'new Random() ..., new Random() ...'. Вместо этого создайте статический экземпляр класса Random и используйте его вместо этого. В противном случае вы получите тот же номер довольно часто. – pinkfloydx33
Кроме того, ваш метод вычитания возвращает «Вектор». Вы пытаетесь присвоить его переменной типа «Velocity». Хотя верно, что 'Velocity' является« Vector »,« Vector »не обязательно является« Velocity »(это может быть« Позиция »). Вы всегда можете выполнить «Вектор-результат = v1.subtract (v2);», но вы будете иметь доступ к общим полям, определенным в «Вектор», которые могут быть или не быть достаточными в зависимости от вашего варианта использования. Другая сторона примечания: в соответствии с соглашениями об именах C# имена методов должны начинаться с заглавной буквы, т.е. 'Change (...)' и 'Subtract (...)'. – pinkfloydx33
Я вижу, вам понравился подход первого ответчика. BTW двойная проверка шахты ... Я считаю, что она соответствует тому, что вы хотите более простым способом. –