C # Java-подобное встроенное расширение классов? - PullRequest
3 голосов
/ 23 марта 2011

Я бы посмотрел это на Google / MSDN, но я понятия не имею, как он называется, поэтому я спрашиваю здесь.

В Java я помню, что вы можете сделать это действительно круто, например:

Class MyClass
{
  int number;

  MyClass() { }

  void setNumber(int number)
  {
    this.number = number;
  }
}

и затем сделайте что-то вроде:

MyClass myClass = new MyClass()
  {
    override void setNumber(int Number)
    {
      this.number = 2 * number;
    }
  };

... или что-то в этом роде.Прошу прощения за любые ошибки, которые я сделал выше - я фактически не трогал Java около 6 лет.

Дело в том, я помню, что вы могли бы псевдо-расширить встроенный класс.

Прямо сейчас яНеобходимо расширить элемент управления C # WinForms, но мне нужно использовать его только один раз, и изменения очень незначительны.Все, что мне нужно сделать, это переопределить свойство CreateParams и обработчик OnPaint().

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

Возможно ли сделать это inline-расширение в C # так же, как в Java?Если так, то как?(и как он называется, чтобы я мог найти его в MSDN?)

Ответы [ 3 ]

5 голосов
/ 23 марта 2011

Это (явные номинативные анонимные типы) невозможно в C # 3 / 4.

Типы должны быть созданы явно, а затем созданы. Задачи иногда «инвертируются» в C # с использованием Events и Delegates (класс вызывает Event, который обеспечивает реализацию, такую ​​как «NeedDataSource») - возможно, из-за этого, хотя во многих случаях это имеет смысл.

Если возможно создать явные неиминативные типы: var x = new { P = 1, };, но только в локальной области видимости. Неявные методы включают в себя делегаты / лямбды / анонимные функции и здесь не применяются.

Удачного кодирования.

1 голос
/ 29 апреля 2012

Я понимаю, что вы сказали, что это нельзя сделать в C #, но возможно переписать это в C #, но не слишком сложным методом?

new EffectClause("Sleep Clause", SleepEffect.class)
{
    public String getClauseDescription()
    {
        return "Bla bla bla";
    }

    public boolean isEnabledByDefault()
    {
        return true;
    }
};
0 голосов
/ 23 марта 2011

Функция, которую вы ищете в C #, называется Методы расширения .Они похожи, но вместо этого вы создаете такой код:

public static void setNumber(int Number, MyClass target)
{
    target.number = 2 * number;
}

Обычно вы включаете его в свое пространство имен расширений, а затем переводите его в область видимости, когда это необходимо, используя MyExtensions;C # может выяснить, что вы хотите вызвать этот метод, когда вызываете what.setNumber (x);

Я не уверен на 100%, позволит ли это переопределить метод, который уже существует в классетем не мение.Другой вариант - наследовать от целевого класса с классом, специально предназначенным для переопределения целевого метода.

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