C # Создание общего класса Vector4?

2

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

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

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

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

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

Теги:
generics
3d

2 ответа

1

Что касается операторов перегрузки, здесь существует решение , в котором объясняется, как это сделать, используя .Net 3.5 (используя Jon Skeet 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

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

  • 0
    Причину отрицательного голосования, пожалуйста?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню