Перевантаження операторів в Visual C # (Sharp)

Як було сказано, оператор + поводиться по-різному з типами string і int Спрівается, яким чином застосування оператора + зі строковим типом змінює його поведінку Змінити поведінку оператора + можна, реалізувавши його в пользовельском типі

Для прикладу, розглянемо покроково реалізацію оператора + для комплексного члового типу Комплексні числа складаються з двох частин: і уявною Наприклад, в комплексному числі а + ь частина а є речовій, а частина ь – уявної При додаванні комплексних чисел, складаються їхні відповідні речові і уявні частини Далі наводиться оголошення комплексного числа: public sealed class ComplexType {

readonly double _real readonly double _imaginary

public ComplexType(double real, double imaginary) {

_real = real

_imaginary = imaginary

}

public double Real { get {

return _real

}

}

public double Imaginary { get {

return „imaginary

}

}

}

Тип compiexType є незмінним і має два члена даних, що подаються речову і уявну частини комплексного числа

Нашою метою є визначити оператор + таким чином, щоб можна було скомпілювати наступний код:

CompiexType а = new CompiexType (1Про, 100) CompiexType b = new CompiexType (20, 200)

CompiexType с = a + b

Перевантаження оператора + означає додавання методу, що має спеціальну націю Далі наводиться модифікований тип CompiexType з реалізованим перевантаженим оператором (відповідний код виділений жирним шрифтом):

public sealed class CompiexType { readonly double „real

readonly double „imaginary

public CompiexType(double real, double imaginary) {

_real = real

„imaginary = imaginary

}

public double Real { get {

return „real

}

}

public double Imaginary { get {

return „imaginary

}

}

public static CompiexType operator +(CompiexType a, CompiexType b) { return new CompiexType (a Real + bReal, aImaginary + b Imaginary)

&gt&nbsp

}

Оголошення перевантаженого оператора являє собою оголошення специалит функції, яка підпорядковується наступним правилам:

• метод завжди оголошується static в контексті типу

• метод має повертається тип, яким повинен бути тип, який ми хочемо створити У більшості випадків це тип оголошення

• ідентифікатор методу починається з оператора, після якого йде пробіл, а потім перевантажується оператор (+, + + і т д)

П параметри методу залежать від перегружаемого оператора Наприклад, при перрузке оператора + + буде тільки один параметр

При перевантаженні операторів слід мати на увазі деякі підводні камені Для їх розуміння розглянемо в подробицях два приклади реалізації оператора іремента Для цілей прикладів, тип compiexType будемо вважати незмінним

public static CompiexType operator ++(CoitplexType a) { aReal++

return a

}

public static CompiexType operator ++(CompiexType a) { return new CoitplexTypefaReal + 1, aImaginary)

}

Оператор инкремента виконує маніпуляції по місцю Отже, слід нам волнять маніпуляції за місцем або створити новий екземпляр Відповісти на це вріс нелегко, оскільки якщо створити новий екземпляр CompiexType, той стан паретра а необхідно повністю передати новому екземпляру

Але зазвичай створюється новий екземпляр, в який копіюється вміст старого екземпляра Але цей підхід має свої наслідки, які необхідно рассмоеть з належною обережністю Скажімо, що ми створили новий екземпляр типу і правильно скопіювали в нього стан У такому разі у нас буде проблема з втратою даних Розглянемо наступний код:

static void CallMethodfCompiexType val) { val++

Console WriteLine(&quot     &quot + valToString())

}

static void Complexlncrement() {

CompiexType a = new CompiexType(10, 100)

ConsoleWriteLine(aToString()) CallMethod(a) ConsoleWriteLine(aToString())

}

Тут метод complexlncrement створює змінну а, після чого привласнює їй значення l o і ЮО Генерується значення, і висновок буде l + ioi Викликається

метод CailMethod, і значення змінної val збільшується на одиницю посредс оператора + + Згенерований висновок тепер буде 2 + ioi Коли створюється останній згенерований висновок, значення комплексного типу має бути 2 і 10, але генерується висновок i + ioi Причиною цьому є та обставина, що посилання на val змінилася на екземпляр нового типу

Це перепризначення відбувається прозоро, і ми не в курсі про зміну Поетові, коли метод CailMethod завершує виконання, він все ще посилається на старе значення а, а не на нове Зміна розташування оператора + + не вирішує прлему У світлі цієї інформації правильним рішенням здається виконання міфікаціі за місцем, але це теж не буде працювати Правильним рішенням буде робота з типом compiexType як з незмінним, таким чином, не допускаючи опатора + + і вирішуючи проблему

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*