У меня есть Matrix
-класс, из которого Vector
-класс получен из-за дополнительной функциональности и лучшего использования У меня есть Vector3
-класс, который получен из Vector
класса.Моя проблема в том, что класс Vector
реализует функцию, например, +normalizeVector:
, которая возвращает новый выделенный экземпляр Vector
.Подкласс Vector3
должен наследовать эти две функции, но наследование приводит к прототипам функций, которые возвращают экземпляр Vector
, а не экземпляр Vector3
.Это как наследование работает, но есть ли хорошая практика, как решить эту проблему?Наивным решением является создание Vector3
также нового класса, подклассы которого NSObject
, но я хочу, чтобы Vector
- и Vector3
- экземпляры могли легко взаимодействовать.
Вот пример кода:
@interface Vector : NSObject {
....
}
+(Vector*) normalizeVector:(Vector*)v; //returns a new allocated Vector-instance
-(Vector*) normalize; //normalizes itself and returns itself
-(Vector*) otherFunction;
@end
@interface Vector3 : Vector {
}
-(Vector3*) specialFunction;
@end
использование этого кода:
Vector3 *v3 = ...;
[[v3 normalize] specialFunction]; //Compiler gives me a warning because Vector has no specialFunction. Cast would help
[[Vector3 normalizeVector:v3] specialFunction]; //Compiler gives me a warning and during runtime it will crash because a `Vector` doesn't implement specialFunction
приведение к Vector3
поможет, но работать с ним неудобнои это также терпит неудачу со статической функцией +normalizeVector:
, потому что в этой статической функции выделяется Vector
-экземпляр и приведение указателя не помогает.
Есть идеи?или другие подходы / другое моделирование?
edit: Код для моей статической функции normalizeVector, которая наследуется Vector3
:
@implementation Vector
...
+(Vector*) normalizeVector:(Vector *)v
{
unsigned int dim = vector_max(v.cols, v.rows);
Vector *res = [[[Vector alloc]initAsColumnVectorWithDim:dim] autorelease];
[Vector normalizeVector:v destination:res]; // this does only the logic: calc length and divide each component by the len and store at the vector passed to destination
return res;
}
@end