У меня возникла проблема, убеждающая Visual Studio и компилятор использовать правильную перегрузку метода, возможно, из-за наследования.Перегрузка метода с неправильной перегрузкой
Учитывая эти объекты:
Public Class Matrix
...
End Class
Public Class Vector
Inherits Matrix
...
End Class
два метода в модуле существует:
Public Function Add(vector1 as Vector, vector2 as Vector) as Vector
...
End Function
Public Function Add(matrix1 as Matrix, matrix2 as Matrix) as Matrix
...
End Function
Однако, когда я явно вызывать Add() на двух векторных объектов, я получаю InvalidCastException потому что вектор не может быть чтобы использовать Matrix для воплощения функции. У меня создалось впечатление, что компилятор попытается использовать наиболее конкретный метод, поэтому для этих аргументов используется метод Vector. Кроме того, если бы была какая-то двусмысленность, компилятор поймал бы их и предоставил бы ошибку.
- Это поведение относится к спецификации?
- Можно ли принудительно использовать метод Vector? Я попробовал лить оба аргумента, но поскольку они уже определены как векторы, это не имеет никакого эффекта.
Редактировать: телефонный код не просил
Обратите внимание, что два Добавить методы в том же модуле Math, т.е.
Public Module Math
Public Function Add(vector1 as Vector, vector2 as Vector) as Vector
...
End Function
Public Function Add(matrix1 as Matrix, matrix2 as Matrix) as Matrix
...
End Function
Public Function Subtract(ByVal vector1 As Vector, ByVal vector2 As Vector) As Vector
Return Add(vector1, -vector2)
End Function
End Module
Можете ли вы показать пример кода, который вызывает Add(). Это может быть проблема с тем, как объявляются переменные. – AlanT
Я добавил код вызова для вас. Единственная связь между этими двумя классами - это наследование. –
Извинения Я исправил код вызова тем, что на самом деле вызывало проблему, и при этом обнаружил мою ошибку. Оператор отрицания потерял свою перегрузку, поэтому -vector2 возвращался к своему оператору отрицания матрицы Matrix. –