C # Создание общего класса Vector4? - PullRequest
2 голосов
/ 28 июня 2009

Есть ли хороший способ создания универсального класса Vector4 в C #? У меня есть пара единиц (сила, расстояние, момент, вращение, ускорение, скорость и т. Д.), Которые все нуждаются в 3d-представлении, и все они ведут себя очень похоже и поэтому должны поддерживать основные функции для сложения, умножения и т. Д.

Каждый класс также содержит несколько особых случаев, например force fordistance = moment. Поэтому я хочу иметь возможность создавать Force3d, наследуемый от Vector4<Force>, поэтому мне не нужно постоянно писать все эти стрелки и иметь возможность добавлять эти специфичные для силы функции в структуру.

Я использовал этот подход, основанный на наследовании, где каждый юнит наследует от Vector4, до сих пор, но это вызывает некоторые проблемы, потому что когда я, например, вызываю Add (force1, force2), я получаю базовый класс, Vector4, вместо Force3d. Так что я заканчиваю тем, что применяю или создаю копию Add-функции для каждого юнита.

Я хочу иметь возможность создавать как Vector4<double>, так и Vector4<Force> без необходимости переопределения всех основных функций для сложения, умножения и т. Д. (Предпочтительно с реальными операторами, что кажется невозможным). Это также добавляет некоторые новые проблемы, потому что лучшим решением было бы заставить Force наследовать от double, но так как все базовые типы запечатаны, мне нужно создать содержащиеся классы, и я в итоге переопределяю здесь базовые операторы для чисел.

Я пробовал каждый возможный подход, но всегда заканчивал тем, что переопределял слишком много вещей.

Ответы [ 2 ]

1 голос
/ 28 июня 2009

Что касается операторов перегрузки, здесь есть решение здесь , которое объясняет, как это сделать с помощью .Net 3.5 (используя библиотеку Джона Скита MiscUtil ).

Чтобы получить правильный тип в результатах методов, вы можете использовать что-то вроде:

public class Vector<T>
{
    public T x { get; }
    public T y { get; }
}

public class VectorWithOperators<TVector, T> : Vector<T> 
   where TVector : Vector<T>, new()
{
    public TVector GetSomeResult()
    {
        return new TVector();
    }
}

public class Force3D : VectorWithOperators<Force3D, double>
{
}
0 голосов
/ 28 июня 2009

Вам нужно только создать общие перегрузки операторов для базового класса Vector4<T>. Пока ваш класс Force корректно перегружает свои собственные операторы, это не должно быть проблемой, поскольку использование операторов на объектах универсальных типов должно правильно разрешать соответствующие перегрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...