Арифметические операторы против методов в Руководстве по проектированию классов - PullRequest
1 голос
/ 27 мая 2009

У меня много математических типов, таких как Point3, и я сталкиваюсь с дилеммой реализации операторов, экземпляров и статических методов для арифметики.

Так сказать тип Point3. Где a, b, c - Point3, я уверен, что смогу сказать:

c = a + b;

Но я должен также реализовать:

c = Point3.Add (a, b);

А это:

c = a.Add (b);

Для меня # 3 бесполезен и менее читабелен, чем # 1. И № 2 кажется бессмысленным, если у вас нет интерфейса для добавления, вычитания, умножения, деления и т. Д.

Что вы рекомендуете? Есть ли какие-либо проблемы или недостатки, связанные с наличием операторов (+, -, *, /)? Не помешает ли это общей арифметике (я знаю, что она не поддерживает ее напрямую, но, возможно, использование статических методов будет полезным в качестве обходного пути)?

Будут ли рекомендации по этому вопросу, будь то класс или структура?

РЕДАКТИРОВАТЬ: Также для № 3, я забыл упомянуть, что это для неизменяемого типа, поэтому возвращает новый Point3, вместо того, чтобы изменить.

Ответы [ 3 ]

3 голосов
/ 27 мая 2009

В целом, я думаю, что Microsoft, похоже, сделала вид A + B в большинстве своих классов, подобных этому.

Примеры можно найти во всем пространстве имен System.Windows.Media.Media3D, а также в математических классах XNA. Оба имеют точку / вектор / кватернион / матрицы / и т. Д., И используют Class.Operator (a, b), и иногда делают c = a + b;

Лично я бы сделал первое, где это имеет смысл и понятно, и всегда делал бы второй вариант. Я обычно реализую первый, используя второй вариант (оператор реализуется статическим методом).

2 голосов
/ 27 мая 2009

Используйте перегрузки оператора для удовлетворения ваших потребностей. Чтобы соблюдать языки .NET, которые не поддерживают перегруженные операторы, включите статические методы, которые переносят операторы (или наоборот). Третий вариант применим только в том случае, если вы используете ссылочные типы и хотите избежать создания новых.

1 голос
/ 27 мая 2009

Языки, такие как VB.NET, не имеют перегрузки операторов, как в C #, поэтому им нужны статические методы, такие как Point3.Add(a, b), для обеспечения сложения и других арифметических операций. Если вы хотите, чтобы ваш тип был CLR-совместимым, вы должны поддерживать эти другие языки, предоставляя эти реализации методов.

Хотя программисты VB.NET (и других языков) могут использовать вызов op_Addition, созданный при компиляции + перегрузки, лучше получить доступ к методу Add. В этом разделе MSDN описаны альтернативные имена методов для каждого оператора.

Третий вариант, который вы описываете, не требуется для соответствия CLS.

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