Перегрузка + оператор для добавления двух массивов

Обработка Java делает аккуратный прием на определении переменной, если Вы не используете инициализатор по умолчанию.

{
   int x;

   if(whatever)
      x=1;

   if(x == 1)
      ...
}

Это даст Вам ошибку во время компиляции, что у Вас есть путь, где X правильно не определяется. Это помогло мне несколько раз, и я взял к рассмотрению инициализации по умолчанию как они:

int x=0;
String s=null;

, чтобы быть плохим шаблоном, так как это блокирует эту полезную проверку.

Однако иногда трудно двигаться - я должен был возвратиться и отредактировать в =null, когда это имело смысл как значение по умолчанию, но я никогда не вставлял его на первой передаче больше.

7
задан John Saunders 29 August 2010 в 02:10
поделиться

5 ответов

Операторы должны быть объявлены внутри тела «связанного» класса. Например:

public class Foo
{
    int X;

    // Legal
    public static int operator+(int x, Foo y);

    // This is not
    public static int operator+(int x, int y);
}

Поскольку у вас нет доступа к реализации массивов, лучше всего было бы либо обернуть массивы в вашу собственную реализацию, чтобы вы могли предоставить дополнительные операции (и это единственный способ сделать оператор +

С другой стороны, вы можете определить метод расширения, например:

public static class ArrayHelper
{
    public static int[] Add(this int[] x, int[] y) { ... }
}

Он по-прежнему будет приводить к естественным вызовам ( x.Add (y) ), избегая при этом оборачивания массивов собственными класс.

17
ответ дан 6 December 2019 в 07:51
поделиться

В нем говорится, что один из параметров оператора должен быть того же типа, что и операторная функция. Поэтому, если операторная функция является членом MyClass, один из параметров должен иметь тип MyClass.

class MyClass
{
 ...

public static int[] operator+(MyClass x, int[] y)
  // public static int[] Add(int[] x, int[] y)
  {
      int[] z = new int[x.Length];

      for (int i = 0; i < x.Length; i++)
      {
        z[i] = x[i] + y[i];
      }

      return (z);
  }
}
2
ответ дан 6 December 2019 в 07:51
поделиться

Если вы хотите перегрузить оператор le + между типами AA и BB, вы должны сделать это в классе AA или BB, а не в классе с именем Program (как вы это сделали).

К сожалению, вы не можете писать код в классе Array .

Вы можете

  • создать свой собственный класс, реализующий IList
  • , и поместить в этот класс оператор +.

Если вам нужна более подробная реализация, просто спросите меня.

1
ответ дан 6 December 2019 в 07:51
поделиться

Вы можете добавлять операторы только в тот тип, который вы создаете сами. int [] - это встроенный тип, к которому нельзя добавлять операторы.

Вы можете создать свой собственный класс, инкапсулирующий массив, и добавить к нему оператор.

1
ответ дан 6 December 2019 в 07:51
поделиться

Вы можете использовать что-то вроде этого:

class Program {
  static void Main(string[] args) {
    const int n = 5;

    var a = new int[n] { 1, 2, 3, 4, 5 }.WithOperators();
    var b = new int[n] { 5, 4, 3, 2, 1 };

    int[] c = a + b;

    for (int i = 0; i < c.Length; i++) {
      Console.Write("{0} ", c[i]);
    }

    Console.WriteLine();
  }
}

public static class Int32ArrayExtensions {
  public static Int32ArrayWithOperators WithOperators(this int[] self) {
    return self;
  }
}

public class Int32ArrayWithOperators {
  int[] _array;

  public Int32ArrayWithOperators(int[] array) {
    if (array == null) throw new ArgumentNullException("array");
    _array = array; 
  }

  public static implicit operator Int32ArrayWithOperators(int[] array) {
    return new Int32ArrayWithOperators(array); 
  }
  public static implicit operator int[](Int32ArrayWithOperators wrapper) {
    return wrapper._array;
  }

  public static Int32ArrayWithOperators operator +(Int32ArrayWithOperators left, Int32ArrayWithOperators right) {
    var x = left._array;
    var y = right._array;
    return x.Zip(y, (a, b) => a + b).ToArray();
  }
}

На основе связанного сообщения, которое я написал.

2
ответ дан 6 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: