2012-05-03 1 views
1

У меня возникла проблема, убеждающая 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. Кроме того, если бы была какая-то двусмысленность, компилятор поймал бы их и предоставил бы ошибку.

  1. Это поведение относится к спецификации?
  2. Можно ли принудительно использовать метод 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 
+0

Можете ли вы показать пример кода, который вызывает Add(). Это может быть проблема с тем, как объявляются переменные. – AlanT

+0

Я добавил код вызова для вас. Единственная связь между этими двумя классами - это наследование. –

+0

Извинения Я исправил код вызова тем, что на самом деле вызывало проблему, и при этом обнаружил мою ошибку. Оператор отрицания потерял свою перегрузку, поэтому -vector2 возвращался к своему оператору отрицания матрицы Matrix. –

ответ

0

Ответы:

  1. Нет это не ; Вероятно, у вас есть несколько объектов типа Vector или Matrix, определенных в вашем проекте. Вот почему вы получаете InvalidCastException.
  2. Вам не нужно.
+0

Я не уверен, как это могло бы быть, поскольку одни и те же именованные объекты в одном и том же пространстве имен сами по себе вызывают ошибки компилятора и если в проекте было несколько пространств имен с тем же объектом, то то, как они ссылаются, нужно было импортировать вызвать столкновение пространства имен. –

0

У меня такая же дилемма, когда IVisualCollection наследует IEnumerable.

Public Function Export(ByVal collection As IVisualCollection) As Object 
    ... 
End Function 

Public Function Export(ByVal collection As IEnumerable) As Object 
    ... 
End Function 

Только вторая функция никогда не используется, независимо от того, что я прохожу в.

+0

Извинения SVanD, моя конкретная проблема была просто проблемой с операторами, этот поток может не решить вашу проблему. –