Как я могу переопределить операторы, которые будут использоваться для встроенных типов, таких как String, массивы и т. Д.? Например: я хочу переопределить поддержку оператора + для массивов.Перегрузка оператора для встроенных типов
ответ
Вы не можете перегружать операторы для существующих типов, поскольку это может потенциально повредить любой другой код, который использует типы.
Вы можете создать свой собственный класс, который инкапсулирует массив, выставлять методы и свойства, которые вам нужны из массива, и перегружать любые операторы, которые имеют смысл.
Пример:
public class AddableArray<T> : IEnumerable<T> {
private T[] _array;
public AddableArray(int len) {
_array = new T[len];
}
public AddableArray(params T[] values) : this((IEnumerable<T>)values) {}
public AddableArray(IEnumerable<T> values) {
int len;
if (values is ICollection<T>) {
len = ((ICollection<T>)values).Count;
} else {
len = values.Count();
}
_array = new T[len];
int pos = 0;
foreach (T value in values) {
_array[pos] = value;
pos++;
}
}
public int Length { get { return _array.Length; } }
public T this[int index] {
get { return _array[index]; }
set { _array[index] = value; }
}
public static AddableArray<T> operator +(AddableArray<T> a1, AddableArray<T> a2) {
int len1 = a1.Length;
int len2 = a2.Length;
AddableArray<T> result = new AddableArray<T>(len1 + len2);
for (int i = 0; i < len1; i++) {
result[i] = a1[i];
}
for (int i = 0; i < len2; i++) {
result[len1 + i] = a2[i];
}
return result;
}
public IEnumerator<T> GetEnumerator() {
foreach (T value in _array) {
yield return value;
}
}
IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return _array.GetEnumerator();
}
}
Использование:
// create two arrays
AddableArray<int> a1 = new AddableArray<int>(1, 2, 3);
AddableArray<int> a2 = new AddableArray<int>(4, 5, 6);
// add them
AddableArray<int> result = a1 + a2;
// display the result
Console.WriteLine(string.Join(", ", result.Select(n=>n.ToString()).ToArray()));
(Обратите внимание, что, как класс реализует IEnumerable<T>
, вы можете использовать методы расширения, как Select
на нем.)
В принципе, вы не можете.
Вы можете использовать методы расширения для добавления функциональности, как это:
public void CustomAdd(this Array input, Array addTo) {
...
}
Но это не работает с операторами.
Вы не можете :)
Вы можете, однако, для примера массива наследуют от IEnnumerable или списка ... и переопределить эти операторы.
Короткий ответ: вы не можете, поскольку указали @Keith.
Более длинный ответ заключается в том, что для того, чтобы добавить оператор перегрузку в класс, вы должны иметь возможность изменить исходный код для этого класса.
В случае, когда оператор добавлен для обработки комбинации двух разных типов (например, массив + строка), достаточно, чтобы вы могли изменить исходный код для одного из этих типов. Это означает, что вы должны иметь возможность добавлять код, чтобы указать, что произойдет, если вы добавите один из своих типов в массив.
В случае классов BCL вам пока не повезло.
- 1. Перегрузка оператора для встроенных типов данных в python
- 2. Перегрузка оператора = для нулевых типов?
- 3. Перегрузка оператора для примитивных типов
- 4. Перегрузка оператора и литье типов
- 5. C++ перегрузка оператора для приведения типов указателей
- 6. Общий класс, перегрузка оператора для разных типов
- 7. Перегрузка оператора для оператора []
- 8. Перегрузка оператора без явного литья типов
- 9. Перегрузка оператора для конкатенации строки
- 10. Перегрузка оператора - перегрузка *
- 11. Перегрузка оператора C++ для оператора + и оператора =
- 12. Перегрузка оператора + для класса данных
- 13. Ковариация для встроенных типов
- 14. Перегрузка оператора = для класса
- 15. Перегрузка оператора для типа
- 16. Перегрузка оператора для манипуляторов
- 17. Как перегрузка оператора «+» для не-примитивных типов работает в java?
- 18. C++ - перегрузка оператора присваивания для типов по умолчанию
- 19. Глобальная перегрузка оператора типа оператора?
- 20. Перегрузка оператора + =
- 21. Перегрузка оператора
- 22. Перегрузка оператора (==)
- 23. Перегрузка оператора
- 24. Перегрузка оператора +
- 25. Перегрузка оператора
- 26. () Перегрузка оператора
- 27. Подвижные версии встроенных встроенных типов?
- 28. Перегрузка оператора '-'
- 29. Встроенных кандидаты оператора
- 30. Перегрузка оператора (=)
Это код очень просто, так что a1 + a2 = унифицированный массив. Почему бы просто не сделать a1.Union (a2) .ToArray() – Keith
Да, это намного проще, но это не так эффективно. Это довольно хорошо, хотя, быстрый тест показывает, что он занимает примерно 2-4 раза дольше. – Guffa