C#   Уроки программирования с нуля. Си-шарп для чайников   C#

Здравствуйте, гость!
Вход
Регистрация


Перегрузка операторов в Си-шарп
Известно, что в Си-шарп существует ряд операторов для работы со встроенными типами данных. Это операторы «+», «-», «!», «==», «!=» и т.д. Например, бинарный оператор «+» выполняет операцию сложения над численными типами данных. Этот же самый оператор над строками выполняет конкатенацию (склеивание двух строк). Это происходит потому, что оператор «+» перегружен в классе String.

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

Перегрузка оператора реализуется похожим способом на перегрузку методов. Здесь используется ключевое слово operator. Общая структура перегрузки операторов имеет следующий вид:

Перегрузка унарного* оператора:

public static [возвращаемый_тип] operator [оператор]([тип_операнда] [операнд])
{
  //функционал оператора
}


Перегрузка бинарного* оператора:

public static [возвращаемый_тип] operator [оператор]([тип_операнда1] [операнд1], [тип_операнда2] [операнд2])
{
  //функционал оператора
}


*Что такое унарные и бинарные операторы читайте в уроке Арифметические и логические операции

Модификаторы public и static являются обязательными. На месте [оператор] может стоять любой оператор, который можно перегрузить. Не все операторы в Си-шарп разрешается перегружать. Ниже наведены операторы которые можно перегружать, и те которые нельзя:

Можно перегружать

Унарные операторы: +, -, !, ++, —, true, false
Бинарные операторы: +, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=

Нельзя перегружать

[] – функционал этого оператора предоставляют индексаторы
() – функционал этого оператора предоставляют методы преобразования типов
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= краткие формы оператора присваивания будут автоматически доступны при перегрузке соответствующих операторов (+, -, * …).

Перегрузка бинарных операторов

Приведу пример перегрузки оператора «+» для сложения объектов класса деньги (Money). Деньги характеризуются количеством и валютой. Если добавлять рубли к рублям, то всё будет корректно. Но если необходимо суммировать доллары и рубли это уже нужно как-то обрабатывать. В случае разных валют можно просто выбросить исключение, что валюты разные, или же переводить одну валюту по курсу в другую и суммировать деньги в одной валюте. Ниже в примере простой вариант с выбросом исключения:

public class Money
{
   public decimal Amount { get; set; }
   public string Unit { get; set; }

   public Money(decimal amount, string unit)
   {
     Amount = amount;
     Unit = unit;
   }
   public static Money operator +(Money a, Money b) //перегрузка оператора «+»
   {
     if (a.Unit != b.Unit)
       throw new InvalidOperationException("Нельзя суммировать деньги в разных валютах");

     return new Money(a.Amount + b.Amount, a.Unit);
   }

}
class Program
{
   static void Main(string[] args)
   {
     Money myMoney = new Money(100, "USD");
     Money yourMoney = new Money(100, "RUR");
     Money hisMoney = new Money(50, "USD");
     Money sum = myMoney + hisMoney; // 150 USD
     sum = yourMoney + hisMoney; // исключение - разные валюты
     Console.ReadLine();
   }
}


Перегрузка унарных операторов

Возьмем программу с первого примера с деньгами, и перегрузим там унарные операторы «++», «--» (добавление/вычитание 1 единицы денег):

public class Money
{
   public decimal Amount { get; set; }
   public string Unit { get; set; }

   public Money(decimal amount, string unit)
   {
     Amount = amount;
     Unit = unit;
   }
   public static Money operator +(Money a, Money b)
   {
     if (a.Unit != b.Unit)
       throw new InvalidOperationException("Нельзя суммировать деньги в разных валютах");

     return new Money(a.Amount + b.Amount, a.Unit);
   }
   public static Money operator ++(Money a) // перегрузка «++»
   {
     a.Amount++;
     return a;
   }
   public static Money operator --(Money a) // перегрузка «--»
   {
     a.Amount--;
     return a;
   }

}
class Program
{
   static void Main(string[] args)
   {
     Money myMoney = new Money(100, "USD");
     myMoney++; // 101 USD
     Console.ReadLine();
   }
}


Также существует возможность перегрузки самого операторного метода. Это означает что в классе может быть несколько перегрузок одного оператора при условии что входные параметры будут отличаться типом данных (например, когда необходимо сложить объект класса и строку):

public class Money
{
   public decimal Amount { get; set; }
   public string Unit { get; set; }

   public Money(decimal amount, string unit)
   {
     Amount = amount;
     Unit = unit;
   }
   public static Money operator +(Money a, Money b)
  {
     if (a.Unit != b.Unit)
       throw new InvalidOperationException("Нельзя суммировать деньги в разных валютах");

     return new Money(a.Amount + b.Amount, a.Unit);
   }
   public static string operator +(string text, Money a)
   {
     return text + a.Amount + " " + a.Unit;
   }

}
class Program
{
   static void Main(string[] args)
   {
      Money myMoney = new Money(100, "USD");
      Console.WriteLine("У меня сейчас " + myMoney); // "У меня сейчас 100 USD"
     Console.ReadLine();
   }
}


Домашнее задание

Задание будет базироваться на примере в этом уроке. Необходимо реализовать второй вариант сложения денег – чтобы можно было суммировать деньги в разных валютах. Для этого создайте отдельный класс, который будет предоставлять механизм конвертации денег по заданному курсу. Кроме этого, перегрузите для класса Money оператор сравнения «==» (при перегрузке данного оператора, обязательной является и перегрузка противоположного ему оператора «!=»).

PS. Не забудьте поделиться с друзьями этой статьей с помощью кнопок социальных сетей.
Понравилась статья? Подпишись на рассылку и узнавай первым о новых уроках по почте!


Поделиться с друзьями:
10 мар 2014 21:22
Кирюха 07 дек 2017 13:34

using System;
using System.Collections;
namespace Peregryzka_Operatorov
{
public class Money
{
public float Amount;
public string Unit;
public float Exchange;
public Money (float Amount, string Unit, float Exchange)
{
this.Amount= Amount;
this.Unit= Unit;
this.Exchange=Exchange;
}
public static Money operator + (Money lhs, Money rhs)
{ float a=0;
string b="";
float c=0;
if (lhs.Unit == "USD" && rhs.Unit != "USD") {
a = rhs.Amount / rhs.Exchange + lhs.Amount;
b= "USD";
c= rhs.Exchange;
}
if (lhs.Unit != "USD" && rhs.Unit == "USD") {
a=lhs.Amount / lhs.Exchange + rhs.Amount;
b="USD";
c=rhs.Exchange;
}
if (lhs.Unit != "USD" && rhs.Unit != "USD") {
a= lhs.Amount / lhs.Exchange + rhs.Amount / rhs.Exchange;
b= "USD";
c= rhs.Exchange;
}
return new Money(a,b,c);
}
public static bool operator ==(Money lhs, Money rhs)
{
return (lhs.Amount==rhs.Amount && lhs.Unit==rhs.Unit );
}
public static bool operator != (Money lhs, Money rhs)
{
return (lhs.Amount!=rhs.Amount || lhs.Unit!=rhs.Unit);
}
}
public class programm
{
public static void Main (string[] args)
{
Money USD= new Money(100,"USD",0);
Money BLR= new Money(200,"BLR",1.9f);
Money RUB= new Money(300, "RUB", 60);
Money EUR= new Money(50,"EUR",0.837f);
Money Bill_Money=new Money(100,"USD",0);
Money My_Money=new Money(100,"USD",0);
Money SUM_1= USD+BLR;
Money SUM_2= BLR+RUB;
Money SUM_3= RUB+EUR;
Money SUM_4= EUR+USD;
Console.WriteLine("Сумма 100 USD и 200 BLR в валюте USD :"+SUM_1.Amount+"\r\n"+"Сумма 200 BLR и 300 RUB в валюте USD :"+SUM_2.Amount+"\r\n"+"Сумма 300 RUB и 50 EUR в валюте USD :"+SUM_3.Amount+"\r\n"+"Сумма 50 EUR и 100 USD в валюте USD :"+SUM_4.Amount);
if (Bill_Money==My_Money)
Console.WriteLine("\r\n"+"Валюта и количество ваших и Била денег совпадают "+"\r\n");
else if (Bill_Money!=My_Money)
Console.WriteLine("\r\n"+"Валюта или количество ваших и Била денег не совпадают "+"\r\n");
}
}
}


Кирюха 01 дек 2017 10:22

public float Amount;
public string Unit;
public float Exchange;
public Money (float Amount, string Unit, float Exchange)
{
this.Amount= Amount;
this.Unit= Unit;
this.Exchange=Exchange;
}
public static Money operator + (Money lhs, Money rhs)
{ float a=0;
string b="";
float c=0;
if (lhs.Unit == "USD" && rhs.Unit != "USD") {
a = rhs.Amount / rhs.Exchange + lhs.Amount;
b= "USD";
c= rhs.Exchange;
}
if (lhs.Unit != "USD" && rhs.Unit == "USD") {
a=lhs.Amount / lhs.Exchange + rhs.Amount;
b="USD";
c=rhs.Exchange;
}
if (lhs.Unit != "USD" && rhs.Unit != "USD") {
a= lhs.Amount / lhs.Exchange + rhs.Amount / rhs.Exchange;
b= "USD";
c= rhs.Exchange;
}
return new Money(a,b,c);
}
public static bool operator ==(Money lhs, Money rhs)
{
return (lhs.Amount==rhs.Amount && lhs.Unit==rhs.Unit );
}
public static bool operator != (Money lhs, Money rhs)
{
return (lhs.Amount!=rhs.Amount || lhs.Unit!=rhs.Unit);
}
}
public class programm
{
public static void Main (string[] args)
{
Money USD= new Money(100,"USD",0);
Money BLR= new Money(200,"BLR",1.9f);
Money RUB= new Money(300, "RUB", 60);
Money EUR= new Money(50,"EUR",0.837f);
Money Bill_Money=new Money(100,"USD",0);
Money My_Money=new Money(100,"USD",0);
Money SUM_1= USD+BLR;
Money SUM_2= BLR+RUB;
Money SUM_3= RUB+EUR;
Money SUM_4= EUR+USD;
Console.WriteLine("Сумма 100 USD и 200 BLR в валюте USD :"+SUM_1.Amount+"\r\n"+"Сумма 200 BLR и 300 RUB в валюте USD :"+SUM_2.Amount+"\r\n"+"Сумма 300 RUB и 50 EUR в валюте USD :"+SUM_3.Amount+"\r\n"+"Сумма 50 EUR и 100 USD в валюте USD :"+SUM_4.Amount);
if (Bill_Money==My_Money)
Console.WriteLine("\r\n"+"Валюта и количество ваших и Била денег совпадают "+"\r\n");
else if (Bill_Money!=My_Money)
Console.WriteLine("\r\n"+"Валюта или количество ваших и Била денег не совпадают "+"\r\n");
}
}
}

Елена 06 ноя 2017 20:22
Стабильная работа, оплата ежедневно!

Вы работаете дома! Полностью честно и прозрачно;
Доступно для всех - неважно кто вы и какой у вас опыт работы в интернете!
Вы будете зарабатывать: свыше четырёх тысяч рублей в день!
Сложность: Несложно!
Оплата: - уже на следующий деньги у вас на счету!

Более подробная информация на нашем сайте. > pisma.exrabota.ru < Скопируйте и вставьте в адресную строку Вашего браузера.

rnikacag 25 окт 2017 18:20
Пройдите 1 регистрацию, сделайте 2 действия
и получайте от 8950 рублей каждые сутки в автоматическом режиме.

Мы гарантируем:
- Первый заработок в течении 60 минут.
- Стабильный доход 24 часа в сутки.
- Поступление денег без задержек.
- Для России, стран СНГ и Европы.
- Без вложений и установки ПО.
- Специально для новичков и людей без опыта.

Ознакомтесь с условиями у нас на сайте. ( prosto.exrabota.ru )

Avito321vom 22 окт 2017 10:51
<b>Пополение баланса Авито (Avito) за 50%</b> | <b>Телеграмм @a1garant</b>

<b>Мое почтение, дорогие друзья!</b>

Рады будем предоставить Всем вам сервис по пополнению баланса на действующие активные аккаунты Avito (а также, абсолютно новые). Если Вам нужны конкретные балансы - пишите, будем решать. Потратить можно на турбо продажи, любые платные услуги Авито (Avito).

<b>Аккаунты не Брут. Живут долго.</b>

Процент пополнения в нашу сторону и стоимость готовых аккаунтов: <b>50% от баланса на аккаунте.</b>
Если требуется залив на ваш аккаунт, в этом случае требуются логин и пароль Вашего акка для доступа к форме оплаты, пополнения баланса.
Для постоянных клиентов гибкая система бонусов и скидок!

<b>Гарантия: </b>

<b>И, конечно же ничто не укрепляет доверие, как - Постоплата!!!</b> Вперед денег не просим...

Рады сотрудничеству!

<b>Заливы на балансы Авито</b>
________

купить мили аэрофлота за деньги авито
купить готовые аккаунты для авито
как на авито изменить номер телефона аккаунта
авито теперь за деньги
как отвязать номер от авито на другой аккаунт

Avito321vom 29 сен 2017 00:38
<b>Пополение баланса Авито (Avito) за 50%</b> | <b>Телеграмм @a1garant</b>

<b>Приветствую вас, дорогие друзья!</b>

Рады будем предоставить Всем вам услуги по пополнению баланса на действующие активные аккаунты Avito (а также, совершенно новые). Если Вам надо определенные балансы - пишите, будем решать. Потратить можно на турбо продажи, любые платные услуги Авито (Avito).

<b>Аккаунты не Брут. Живут долго.</b>

Процент пополнения в нашу сторону и стоимость готовых аккаунтов: <b>50% от баланса на аккаунте.</b>
Если нужен залив на ваш аккаунт, в этом случае требуются логин и пароль Вашего акка для доступа к форме оплаты, пополнения баланса.
Для постоянных заказчиков гибкая система бонусов и скидок!

<b>Гарантия: </b>

<b>И, конечно же ничто не укрепляет доверие, как - Постоплата!!!</b> Вперед денег не просим...

Рады сотрудничеству!

<b>Заливы на балансы Авито</b>
________

забанили аккаунт авито
заблокировали аккаунт на авито
уборка квартиры за деньги частному лицу москва на авито
авито отвязать номер от удаленного аккаунта
возврат денег на авито

Nataliehic 24 сен 2017 23:02
Данное сообщение размещено здесь с помощью XRumer + XEvil 3.0
XEvil 3.0 - революционное приложение, способное обходить практически любую антибот-защиту.
Распознавание капчи Google, Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!
Вы читаете это - значит, это работает! ;)
Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

Maks 10 сен 2017 17:14

class Money
{

public int Amuont { get; set; }
public string Unit{ get; set; }

public Money (int Amuont, string Unit)
{
this.Amuont = Amuont;
this.Unit = Unit;
}

public static Money operator +( Money a, Money b)
{
if (a.Unit != b.Unit)
{
Console.WriteLine("Разный тип валют.\nКовертацыя {0} {2} в {1}",b.Amuont,a.Unit, b.Unit);
b.Amuont = Konvert(b.Amuont, a.Unit, b.Unit);
return new Money(a.Amuont + b.Amuont, a.Unit);

}

return new Money(a.Amuont + b.Amuont, a.Unit);

}
public static int Konvert(int Amount, string aUnit,string bUnit)
{
Console.WriteLine("Введите курс {0} к {1}", bUnit, aUnit);
Console.Write("1 {0} в {1} = ", bUnit, aUnit);
int cuorse = Convert.ToInt32(Console.ReadLine());
int Result = Amount * cuorse;
return Result;
}

}

class Program
{
static void Main(string[] args)
{
Money myMoney = new Money(23, "UAN");
Money youMoney = new Money(30, "USD");
Money sum = myMoney + youMoney;
Console.WriteLine("Result : "+sum.Amuont + " " + sum.Unit);
Console.ReadKey();
}
}
}

Maks 09 сен 2017 18:26
Сидел 2 дня читал , рили никак не доходило до меня.. пока не закинул код в ВС , там уже все разобрал .. все отлично , уже написал бота по урокам на этом сайте (похвастаюсь , регает акк в фейсе) а пожелание что бы код примера как то реализовать как в ВС (тойсь что бы были разные цвета класа/поля/метода и т.д .. так больше понятней) , хотя кто хочет и так поймет )

Александр 29 авг 2017 21:50
Тема оказалась для меня достаточно трудной, но получилось вот это вот )

using System;

namespace Lesson25
{
public class Money
{
public double Amount { get; set; }
public string Unit { get; set; }

public Money(double amount, string unit)
{
Amount = amount;
Unit = unit;
}
public static Money operator + (Money a, Money b)
{
return new Money(a.Amount + b.Amount, a.Unit);
}
public static bool operator == (Money a, Money b)
{
if (a.Amount == b.Amount)
return true;
return false;
}
public static bool operator != (Money a, Money b)
{
if (a.Amount != b.Amount)
return true;
return false;
}


}
public class MoneyConverter
{
string USD = "USD";
string RUB = "RUB";
public void Converter(Money a, Money b)
{
if (a.Unit == USD && b.Unit == RUB)
{
a.Amount = a.Amount * 59;
}
else if (b.Unit == USD && a.Unit == RUB)
{
b.Amount = b.Amount * 59;
}
else if (a.Unit == USD && b.Unit == USD)
{
a.Amount = a.Amount;
b.Amount = b.Amount;
}
}
}


class MainClass
{
public static void Main(string[] args)
{
Money Alex = new Money(50, "USD");
Money Bob = new Money(1250, "RUB");
MoneyConverter MC = new MoneyConverter();
MC.Converter(Alex, Bob);
Money sum = Alex + Bob;
Console.WriteLine(sum.Amount);
Console.ReadKey();
}
}
}

Inferno 23 авг 2017 17:21
Я ни как не могу понять для чего нужна перезагрузка оператора... Пытался гуглить, так и не нашел ничего путного.
И что это за функция такая " throw new InvalidOperationException"?? Я так понял, что это обработка исключения, но как с ним работать? В уроке о try и catch нет такого.
Хотелось бы получить ответы , ибо изучение встало

=================================================
В уроке доходчиво объяснено ,что перегрузка используется в тех случаях когда базовый функционал операнда не позволяет получить нужный результат так как мы работаем не просто с типами , а с экземплярами классов и требуется дополнительная логика для получения результат , как тут например сложение разных валют без предварительной конвертации в одну валюту.
trow new exception позволяет в логи создавать свои собственные исключения , подробнее смотри на майкрософта или просто в гугле в конце концов ничего не мешает гуглить непонятные конструкции по любому поводу.Если не научишься сам искать базовую информацию по запросам далеко продвинуться не сможешь.

WarriorDayz 14 авг 2017 21:55
Я ни как не могу понять для чего нужна перезагрузка оператора... Пытался гуглить, так и не нашел ничего путного.
И что это за функция такая " throw new InvalidOperationException"?? Я так понял, что это обработка исключения, но как с ним работать? В уроке о try и catch нет такого.
Хотелось бы получить ответы , ибо изучение встало

wnikacag 25 фев 2017 17:20
Пройдите 1 регистрацию, сделайте 2 действия
и получайте от 8950 рублей каждые сутки в автоматическом режиме.

Мы гарантируем:
- Первый заработок в течении 60 минут.
- Стабильный доход 24 часа в сутки.
- Поступление денег без задержек.
- Для России, стран СНГ и Европы.
- Без вложений и установки ПО.
- Специально для новичков и людей без опыта.

Более подробная информация на нашем сайте. ( Prosto-dengi.tk )

Юрец 16 ноя 2016 19:45

namespace ReloadOperatorS
{
class Money
{
public double Amount { get; set; }
public string Unit { get; set; }

public Money (double amount, string unit)// конструктор
{
Amount = amount;
Unit = unit;
}

public static Money operator +(Money a, Money b)// делаем перегрузку оператора "+"
{
if (a.Unit.Contains("USD") || b.Unit.Contains("USD"))// проверяем содержит ли строка подстроку "USD"
{
return new Money((a.Amount * 65.55) + b.Amount, "USD");// если у нас баксы, делаем пересчет по курсу ЦБ
}
else
{
return new Money(a.Amount + b.Amount, "USD");
}
}

public static bool operator ==(Money a, Money b)// перегружаем оператор сравниния
{
if (a.Amount == b.Amount)
return true;
return false;
}

public static bool operator !=(Money a, Money b)//перегружаем оператор сравнения
{
if (a.Amount != b.Amount)
return true;
return false;
}
}

class Program
{
static void Main(string[] args)
{
Money myMoney = new Money(100, "USD");
Money yourMoney = new Money(100, "RUR");
Money hisMoney = new Money(50, "USD");
Money sum = myMoney + yourMoney;//складываем используя перегруженный оператор сложения
Console.WriteLine(sum.Amount +" "+ sum.Unit);

if (myMoney.Amount == yourMoney.Amount)// делаем проверку на равенство
{
Console.WriteLine("Значения одинаковые");
}
else
{
Console.WriteLine("Значения отличаются");
}


Console.ReadKey();
}
}
}

bas-tion.ru 08 май 2016 14:33

class Program
{
// Перегрузка операторов == и !=
// Создаём класс с одним полем, конструктором и функцией перегрузки оператора.
class myMoney
{
private int Amount;

public myMoney(int anAmount) // Конструктор присваивает переменным объекта значения, не может ничего возвращать
{
Amount = anAmount;
}

// Добавляем перегрузку оператора ==, после которой объекты класса смогут сравниваться
// Результатом сравнения (возвращается) является bool переменная true или false
// Сравнивать будем по полю Amount.

public static bool operator == (myMoney a, myMoney b)
{
if (a.Amount == b.Amount)
{
return true;
}
else
{
return false;
}
}
public static bool operator !=(myMoney a, myMoney b)
{
if (a.Amount != b.Amount)
{
return true;
}
else
{
return false;
}
}

}
static void Main(string[] args)
{
// Создаём два объекта класса myMoney
myMoney wallet1 = new myMoney(250);
myMoney wallet2 = new myMoney(250);

// Пробуем сравнить.
if (wallet1 == wallet2)
{
Console.WriteLine("wallet1 и wallet2 равны");
}else
{
Console.WriteLine("wallet1 и wallet2 не равны");
}



Console.ReadKey();


}
}

bas-tion.ru 07 май 2016 23:24
Задание показалось довольно простым. В коде "перегрузка бинарных операторов " необходимо изменить строку throw... на строку:


MoneyConvert.ToConvertMoney(b.Unit, a);


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


public class MoneyConvert
{
public static void ToConvertMoney(string currency, Money a) // метод перевода из доллара в рубль или наоборот
{
int value = 66; // курс рубля к доллару
if (currency == "RUR") // если переводим в рубли то
{
a.Amount = a.Amount * value; // умножаем на курс и заносим в переменную
}
else // или переводим в доллары
{
a.Amount = a.Amount / value; // делим на курс и заносим в переменную
}
a.Unit = currency; // меняем название валюты

}
}

Код целиком:


//
public class Money
{
public decimal Amount { get; set; }
public string Unit { get; set; }

public Money(decimal amount, string unit)
{
Amount = amount;
Unit = unit;
}
public static Money operator +(Money a, Money b) //перегрузка оператора «+»
{
if (a.Unit != b.Unit)
MoneyConvert.ToConvertMoney(b.Unit, a);

return new Money(a.Amount + b.Amount, a.Unit);
}

}
public class MoneyConvert
{
public static void ToConvertMoney(string currency, Money a) // метод перевода из доллара в рубль или наоборот
{
int value = 66; // курс рубля к доллару
if (currency == "RUR") // если переводим в рубли то
{
a.Amount = a.Amount * value; // умножаем на курс и заносим в переменную
}
else // или переводим в доллары
{
a.Amount = a.Amount / value; // делим на курс и заносим в переменную
}
a.Unit = currency; // меняем название валюты

}
}

class Program
{
static void Main(string[] args)
{
Money myMoney = new Money(100, "USD");
Money yourMoney = new Money(100, "RUR");
Money hisMoney = new Money(50, "USD");
Money sum = myMoney + hisMoney; // 150 USD
sum = yourMoney + hisMoney; // Сумма в долларах
Console.WriteLine(sum.Amount + sum.Unit); // 51.5151515151USD
Console.ReadLine();
}
}

Михаил 08 апр 2016 17:48
Сделал три варианта конвертеров, ни в одном не понадобилось перегружать == и !=. Потом все-таки придумал как СОЗДАТЬ НЕОБХОДИМОСТЬ перегрузить, но показалось совсем уж бессмысленным и время- и трудо-затратно. Автор, придумай, пожалуйста, какое-нибудь разумное требование для дз, пожалуйста :)

Игорь 01 фев 2016 12:27
Спасибо за уроки.
У меня все по проще.
class Money
{
internal const string Rub = "R";
internal const string Dollar = "$";
internal const double kurs = 80;

internal int kol_vo;
internal string Baluta;
public Money(int a, string b)
{
kol_vo = a;
if (b == Rub)
{
Baluta = Rub;

}
else if (b == Dollar)
{
Baluta = Dollar;
}
else
{
throw new InvalidOperationException("C такой валютой не работаем");


}
}
class Convert_to_Rub
{
public Convert_to_Rub(Money a)
{
if (a.Baluta ==Dollar )
{
a.kol_vo=a.kol_vo*kurs;
a.Baluta = Rub;
}
}
}
public static Money operator +(Money _a, Money _b)
{
Convert_to_Rub ab = new Convert_to_Rub(_a);
Convert_to_Rub ac = new Convert_to_Rub(_b);
return new Money(_a.kol_vo + _b.kol_vo, Rub);
}



class Program
{
static void Main(string[] args)
{
Money my_money=new Money(5,"$");
Money my_zarplata = new Money(2000, "R");
Money abc=my_money+my_zarplata;
Console.WriteLine(abc.kol_vo);

}
}
}
}

Евгений 10 янв 2016 17:24

class Program
{
public static void Main(string[] args)
{
Money pFirst = new Money(10, Money.USD);
Money pSecond = new Money(5, Money.UAH);
Money pResult = pFirst+pSecond;
Console.Write(pResult.dAmount + " " + pResult.sUnit);
Console.ReadKey();
}
}

public class Money
{
public const string UAH = "UAH";
public const string USD = "USD";
public const string EUR = "EUR";

public string sUnit{get;set;}
public double dAmount{get;set;}

public Money()
{

}
public Money(double dAmount, string sUnit)
{
this.sUnit = sUnit;
this.dAmount = dAmount;
}

public static Money operator + (Money a, Money b)
{
Money pTmp;
if(a.sUnit != b.sUnit)
{
pTmp = Exchenge.Convert(a, b);
}
else
{
pTmp = new Money(a.dAmount + b.dAmount, a.sUnit);
}
return pTmp;
}
}

public class Exchenge
{
public Exchenge()
{
}

public static Money Convert(Money pFirst, Money pSecond)
{
double dAmountFrom = pFirst.dAmount;
string sUnitFrom = pFirst.sUnit;
double dAmountTo = pSecond.dAmount;
string sUnitTo = pSecond.sUnit;
double dCourse = 1;
if(sUnitFrom == sUnitTo)
{
dCourse = 1;
}
else if(sUnitFrom == Money.USD)
{
if(sUnitTo == Money.EUR)
{
dCourse = 1.2;
}
else if(sUnitTo == Money.UAH)
{
dCourse = 0.4;
}
}
else if(sUnitFrom == Money.EUR)
{
if(sUnitTo == Money.USD)
{
dCourse = 0.89;
}
else if(sUnitTo == Money.UAH)
{
dCourse = 0.35;
}
}
else if(sUnitFrom == Money.UAH)
{
if(sUnitTo == Money.USD)
{
dCourse = 25.2;
}
else if(sUnitTo == Money.EUR)
{
dCourse = 26.4;
}
}

return new Money(dAmountTo*dCourse + dAmountFrom, sUnitFrom);
}
}


P.S. Не вижу смысла делать перегрузку == И != Для решения этой задачи.

Kolsky 01 янв 2016 14:50
Небольшая поправочка:

public void RUB_USD()
{
this.Amount /= 80.02;
}

Kolsky 01 янв 2016 14:48

using System;
using System.Threading;
namespace m
{
interface IConverter
{
void USD_RUB();
void RUB_USD();
}
public class Money
{
public double Amount { get; set; }
public string Unit { get; set; }
public void USD_RUB()
{
this.Amount *= 80.02;
}
public void RUB_USD()
{

}
public Money(double amount, string unit)
{
Amount = amount;
Unit = unit;
}
public static Money operator +(Money a, Money b) //перегрузка оператора «+»
{
if (a.Unit != b.Unit)
{
if (a.Unit == "RUB" && b.Unit == "USD") a.RUB_USD();
else if (a.Unit == "USD" && b.Unit == "RUB") a.USD_RUB();
else throw new InvalidOperationException("Нельзя суммировать деньги в разных валютах");
}
return new Money(a.Amount + b.Amount, a.Unit);
}
public static Boolean operator ==(Money a, Money b)
{
if (a.Unit != b.Unit)
{
if (a.Unit == "RUB" && b.Unit == "USD") a.RUB_USD();
else if (a.Unit == "USD" && b.Unit == "RUB") a.USD_RUB();
else throw new InvalidOperationException("Нельзя суммировать деньги в разных валютах");
}
return a.Amount == b.Amount ? true : false;
}
public static Boolean operator !=(Money a, Money b)
{
if (a.Unit != b.Unit)
{
if (a.Unit == "RUB" && b.Unit == "USD") a.RUB_USD();
else if (a.Unit == "USD" && b.Unit == "RUB") a.USD_RUB();
else throw new InvalidOperationException("Нельзя суммировать деньги в разных валютах");
}
return a.Amount == b.Amount ? true : false;
}
}
class Program
{
static void Main(string[] args)
{
try
{
Money a = new Money(100, "USD");
Money b = new Money(15000, "RUB");
Money c = new Money(1200, "UAH");
Console.WriteLine(a == b ? "a равно b" : "a не равно b");
Console.ReadKey(true);
bool d = a != c;//InvalidOperationException
}
catch (InvalidOperationException)
{
Console.WriteLine("Йибриф бай льфуст ут рихфнис");
Thread.Sleep(1000);
}
}
}
}

Александр 25 ноя 2015 22:03
Спасибо за уроки!!!


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lesson25_operatorOverloading_
{

class Money
{
public decimal Amount { get; set; }
public string Unit { get; set; }

public Money()
{
Amount = 0;
Unit = "";
}

public Money(decimal amount, string unit)
{
Amount = amount;
Unit = unit;
}

public void Equals(Money a)
{
this.Amount = a.Amount;
this.Unit = a.Unit;
}

public void Show()
{
Console.Write(this.Amount +" " + this.Unit);
}

public static Money operator +(Money a, Money b)
{
if (a.Unit != b.Unit) Convert.DoIT(a, b);
return new Money(a.Amount + b.Amount, a.Unit);
}

public static bool operator ==(Money a, Money b)
{
return (a.Unit == b.Unit && a.Amount==b.Amount);
}

public static bool operator !=(Money a, Money b)
{
return (a.Unit != b.Unit || a.Amount != b.Amount) ;
}
}

class Convert
{

public static Money DoIT(Money a, Money b)
{
if (a.Unit == "RUB") Convert.ToRUB(b);
else if (a.Unit == "USD") Convert.ToUSD(b);
else if (a.Unit == "UAH") Convert.ToUAN(b);
return b;
}

public static Money ToUAN(Money money)
{
if (money.Unit == "RUB") money.Amount /= 3m;
else if (money.Unit == "USD") money.Amount *= 20m;
else if (money.Unit == "UAH") money.Amount = money.Amount;
else throw new InvalidOperationException("Некорректно задана валюта");
money.Unit = "UAH";
return money;
}

public static Money ToRUB(Money money)
{
if (money.Unit == "RUB") money.Amount =money.Amount;
else if (money.Unit == "USD") money.Amount *= 60m;
else if (money.Unit == "UAH") money.Amount *= 3m;
else throw new InvalidOperationException("Некорректно задана валюта");
money.Unit = "RUB";
return money;
}

public static Money ToUSD(Money money)
{
if (money.Unit == "RUB") money.Amount /= 60m;
else if (money.Unit == "USD") money.Amount = money.Amount;
else if (money.Unit == "UAH") money.Amount /= 20;
else throw new InvalidOperationException("Некорректно задана валюта");
money.Unit = "USD";
return money;
}
}

class Program
{
static void Main(string[] args)
{
Money myMoney1 = new Money(100, "UAH");
Money myMoney2 = new Money(100, "RUB");
Money myMoney3 = new Money(100, "USD");
Money myMoney4 = new Money(100, "UAH");

Money money = new Money() ;
money.Equals(myMoney1 + myMoney3);
money.Show();
Console.WriteLine();

Console.WriteLine(myMoney1==myMoney4 ? "The same" : "different");
Console.WriteLine(myMoney1 != myMoney3 ? "different" : "the same");

Console.ReadKey();
}
}
}


только у меня возникает ошибка "'lesson25_operatorOverloading_.Money' defines operator == or operator != but does not override Object.Equals(object o)" при этом все корректно работает




rotkiv 16 окт 2015 00:55
странно то что перегрузка "==" и "!=" одно без другого не работает, или это у меня вижуал глючит

rotkiv 16 окт 2015 00:52

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication_ypok25
{
public class Money
{
public const double rubleiZAbaks = 33.59;
public double Quantity { get; set; }
public string Kind { get; set; }
public Money(double quantity, string kind)
{
Quantity = quantity;
Kind = kind;
}
public static Money operator +(Money a, Money b)
{
if (a.Kind != b.Kind)
b.Quantity = b.Quantity * rubleiZAbaks;
return new Money(a.Quantity + b.Quantity, a.Kind);
}
public static bool operator ==(Money a, Money b)
{
if (a.Kind != b.Kind)
return true;
else
return false;
}
public static bool operator !=(Money a, Money b)
{
if (a.Kind != b.Kind)
return true;
else
return false;
}
}
class Program
{
static void Main(string[] args)
{
Money firstMoney = new Money(256, "USD");
Money secondMoney = new Money(32, "RUR");
Money sum = firstMoney + secondMoney;
Console.WriteLine(sum.Quantity);
Console.WriteLine(firstMoney == secondMoney ? "Aga, ne odinakovi" : "Aga, odinakovi");
Console.ReadKey();
}
}
}

Максим 06 окт 2015 10:13
Виталий_Ф
---
1. Это создание экземпляра, точно такое же, как и

Money myMoney = new Money(100, "USD");

2. Это перегрузка оператора "+", да, он в итоге создает новый экземпляр. Не встречали, потому что этот урок именно об этом впервые и рассказывает.

Виталий_Ф 04 окт 2015 23:40
Спасибо Максиму (автору) за уроки. Кратко-ясно, но на 20-х уроках стал "запинаться". В предыдущих уроках не встречал конструкций кода
1.
public class Money
{
...
return new Money(a.Amount + b.Amount, a.Unit);
}
В объявлении класса возврат самого класса?
а когда создаём экземпляр класса
Money myMoney = new Money(100, "USD");
мы передаём аргументы но ведь ничего не возвращается.

2.
Money sum = myMoney + hisMoney; // 150 USD
- это создание экземпляра sum с передачей аргументов?
до сих
Money myMoney = new Money(100, "USD");
только такую конструкции в уроках встречались.
В общем начинаю "тонуть", подскажите разъясните пожалуйста

Flamingo 29 авг 2015 19:25

class Money
{
internal double Amount;
internal string Unit;
public Money(double amount, string unit)
{
Amount = amount;
Unit = unit;
}
public static Money operator +(Money a, Money b)
{
if(a.Unit != b.Unit)
{
if (a.Unit == "RUS")
{
a.Unit = "USD";
a.Amount /= 60;
}
else
{
b.Unit = "USD";
b.Amount /= 60;
}
}
return new Money(a.Amount + b.Amount, a.Unit);
}
public static bool operator ==(Money a, Money b)
{
if (a.Amount == b.Amount && a.Unit == b.Unit)
return true;
return false;
}
public static bool operator !=(Money a, Money b)
{
if (a.Amount != b.Amount || a.Unit != b.Unit)
return true;
return false;
}
}
class Program
{
static void Main(string[] args)
{
Money MyMoney = new Money(600, "RUS");
Money HisMoney = new Money(20, "USD");
Money sum = MyMoney + HisMoney;
Console.WriteLine(sum.Amount + " " + sum.Unit);
Console.WriteLine(MyMoney == HisMoney);
Console.WriteLine(MyMoney != HisMoney);
}
}

Александр_Бугай 17 май 2015 17:17
class Money
{
internal double Number{get;set;}
internal string Currently{get;set;}
public Money(double number, string currently)
{
Number = number;
Currently = currently;
}
public static Money operator /(Money a, Money b)
{
if (a.Currently == b.Currently)
{
Console.WriteLine(a.Number);
}
else
{
if (a.Currently == "USD" && b.Currently == "RUS")
{
b.Number = a.Number / 0.1;
}
if (a.Currently == "USD" && b.Currently == "EUR")
{
b.Number = a.Number / 2;
}
if (a.Currently == "EUR" && b.Currently == "USD")
{
b.Number = a.Number / 0.5;
}
if (a.Currently == "EUR" && b.Currently == "RUS")
{
b.Number = a.Number / 0.05;
}
if (a.Currently == "RUS" && b.Currently == "EUR")
{
b.Number = a.Number / 20;
}
if (a.Currently == "RUS" && b.Currently == "USD")
{
b.Number = a.Number / 10;
}
}
return new Money(b.Number, b.Currently);
}
}
class Program
{

static void Main(string[] args)
{
Console.WriteLine("Input your currently to sale:USD, EUR, RUS: ");
string cur = Convert.ToString(Console.ReadLine());
Console.WriteLine("Input your currently to buy: USD, EUR, RUS: ");
string otherCur = Convert.ToString(Console.ReadLine());
Console.WriteLine("Input number to sale:");
double numberSale = Convert.ToDouble(Console.ReadLine());
Money moneySale = new Money(numberSale, cur);
Money moneyBuy = new Money(0, otherCur);
if (moneySale.Currently == moneyBuy.Currently)
{
Console.WriteLine("You want to change on same currently, so your result is " + moneySale.Number + moneySale.Currently);
}
else
{
Money moneyChange = moneySale / moneyBuy;
Console.WriteLine(moneyChange.Number + " " + moneyChange.Currently);
}
Console.ReadLine();
}
}

Азиз 17 май 2015 13:47
Конвертер в отдельный класс не клал, но пашет все

class Program
{
public static void Main(string[] args)
{
Money first = new Money(1000, "RUS");
Money second = new Money(200, "USD");

Console.ReadLine();
Console.WriteLine(first.Amount + " " + first.Unit + " + " + second.Amount + " " + second.Unit + " = " + (first + second).Amount.ToString() + " USD");

Console.ReadKey();
}
}
class Money
{
public int Amount;
public string Unit;

public Money(int amount, string unit)
{
this.Amount = amount;
this.Unit = unit;
}
public static Money operator +(Money a, Money b)
{
if (a.Unit == b.Unit)
{
return new Money(a.Amount + b.Amount, b.Unit);
}
else
{

if (a.Unit != "USD")
{
a.Unit = "USD";
a.Amount = a.Amount / 60;
}
else if (b.Unit.ToString() != "USD") {
b.Unit = "USD";
b.Amount = b.Amount / 60;

}
return new Money(a.Amount + b.Amount,"USD");
}
}
public static bool operator ==(Money a, Money b)
{
if (a.Amount == b.Amount && a.Unit == b.Unit) {
return true;
}
else
{
return false;
}
}
public static bool operator !=(Money a, Money b)
{
if (a.Amount != b.Amount || a.Unit != b.Unit) {
return true;
}
else
{
return false;
}


}

}

Kavi4 02 апр 2015 20:05
Я вот только у вас узнал что можно перегружать операторы это же просто АХРИНЕТЬ сколько всего можно сделать. Спасибо что все так понятно написано.

Максим 25 фев 2015 09:31
AlexWolf
---
Уже так,как и требовалось в дз.

AlexWolf 24 фев 2015 13:56
Здравствуйте Максим. Сделал работы над ошибками. Точнее написал сначала, как вы и говорили. Смотрел ваш код и кое-что позаимствовал от туда. Однако там вы использовали некоторые "инструменты", о которых не было рассказано в предыдущих уроках, например список констант вне классов, которые можно вызывать из любого места. И еще у вас в коде некоторые имена одинаковые и мне, как новичку, было непросто разобраться, какое к чему относится... ну да ладно, вроде понял. Вот код... мне кажется получилось лучше, чем в первый раз. Что скажите?


namespace ConsoleApplication1
{
class Money
{
public decimal Kolvo { get; set; }
public string Valuta { get; set; }
public decimal Kurs = 1;
public Money(decimal kolvo, string valuta)
{
Kolvo = kolvo;
Valuta = valuta;
}
public static Money operator +(Money a, Money b)
{
return a.Valuta == b.Valuta&&a.Valuta==" RUB" ? new Money((a + b).Kolvo, a.Valuta) : new Money((a.Kolvo*Convertor.Kursovik(a) + b.Kolvo*Convertor.Kursovik(b)), " RUB");
}
public static bool operator ==(Money a, Money b)
{
return a.Valuta == b.Valuta ? a.Kolvo == b.Kolvo : a.Kolvo == b.Kolvo*Convertor.Kursovik(b);
}
public static bool operator !=(Money a, Money b)
{
return !(a == b);
}
}
class Convertor
{
public static decimal Kursovik(Money x )
{
switch (x.Valuta)
{
case " USD":
x.Kurs = 63;
break;
case " EUR":
x.Kurs = 71;
break;
case " JPY":
x.Kurs = 53;
break;
case " RUB":
x.Kurs = 1;
break;
} return x.Kurs;
}
}
class Program
{
static void Main(string[] args)
{
Money rubli = new Money(100, " RUB");
Money dollars = new Money(100, " USD");
Money evro = new Money(100, " EUR");
Money yens = new Money(100, " JPY");
Console.WriteLine(rubli.Kolvo + rubli.Valuta + " + " + dollars.Kolvo + dollars.Valuta + " = " + (rubli + dollars).Kolvo + (rubli + dollars).Valuta);
Console.WriteLine(evro.Kolvo + evro.Valuta + " + " + yens.Kolvo + yens.Valuta + " = " + (evro + yens).Kolvo + (evro + yens).Valuta);
Console.WriteLine(dollars.Kolvo + dollars.Valuta + " + " + evro.Kolvo + evro.Valuta + " = " + Math.Round((dollars + evro).Kolvo / Convertor.Kursovik((yens)),2) + yens.Valuta);
Console.WriteLine(rubli.Kolvo + rubli.Valuta + " + " + evro.Kolvo + evro.Valuta + " + " + yens.Kolvo + yens.Valuta+" = "+Math.Round((dollars+evro+yens).Kolvo / Convertor.Kursovik((dollars)),2) + dollars.Valuta);
Console.ReadKey();
}
}
}

Виталий 21 фев 2015 08:51
Спасибо! Наконец-то я понял, как это делается, то-есть никаких цифр, все только переменные? Спасибо что смогли впихнуть это в мою голову.

Максим 20 фев 2015 20:06
Виталий
---
У вас оператор "+" принимает аргументы типа int, а они должны быть типа Money.

А эту вашу строку:
rubleskurs == rubles + dollars == rubles + (dollars * 100);
можно расшифровать как
true (bool) + true (bool) + 100 (int)
Нельзя использовать оператор "+" с операндами разных типов, это как три банана плюс две клавиатуры, из такой суммы нычего не получится.

Примерно так должна выглядить перегрузка оператора, ну и сюда еще только конструктор нужно дописать.

class Money {
int kolichestvo;
string valuta;
float kursDollara;
public static Money operator +(Money m1, Money m2)
{
return m1.valuta == m2.valuta ? new Money(m1.kolichestvo + m2.kolichestvo, m1.valuta) : new Money(m1.kolichestvo + m2.kolichestvo * kursDollara, m1.valuta);
}
}

Виталий 20 фев 2015 13:24
Я правильно понял, что он распознает мое действие как кусок кода, а у вас все сразу идет через return? Сделал по вашим подсказкам, и по анализу вашей домашки такую. Осталась одна проблема: пишет "Для нестатического поля, метода или свойства...":

class Money
{
int rubleskurs;
int rubles;
int dollars;
public static Money operator +(int rubles, int dollars)
{
return rubleskurs == rubles + dollars == rubles + (dollars * 100);
}
}

Максим 20 фев 2015 10:03
Виталий
---
Возьмем простой тип int, для него оператор "+" реализован примерно так:

public static int operator +(int a, int b)
{
return a + b;
}

Он получает два аргумента того типа, в котором объявлен (int), и этот же тип возвращает.

Оператор "+" как бы означает сумму двух операндов операндов.

rubles + dollars == rubles + (dollars * 100); // эта строка возвращает булевое значение, но это не возвращение из метода, нет return. Ну и не булевое значение должно возвращаться, а такой же тип, как и два операнда, в вашем случае myMoney.
2 Рубля + 1 Рубль должно вернуть тоже деньги, 3 рубля.

Изначально класс вы не тот создали, не МоиДеньги (ТвоиДеньги, ЕгоДеньги тогда тоже отдельные классы?), а просто Деньги, а дальше можно создать класс Человек, и у него будет свойство Деньги.

Проанализируйте мою реализацию д/з, комментарий Максим 14 фев 2015 02:28

Виталий 20 фев 2015 08:50
Оять не получилось. Расскажите пожалуйста почему "в качестве опреатора могут использоваться только..." и "тип одного из параметров бинарного оператора должен быть вмещающим"??? Вот моя неудачная версия домашки:
PS: скажите пожалуйста, я правильно понял как это делается?

class myMoney
{
int rubles;
int dollars;
public static myMoney operator +(int rubles, int dollars)
{
rubles + dollars == rubles + (dollars * 100);
}
}

Максим 14 фев 2015 02:28
Вот, решил сам сделать дз, советую проанализировать код. Все курсы валют только относительно рубля. Захардкодил, так как урок не о вводе данных. У кого есть желание, можете добавить в программу еще валюту (евро например), и оценить гибкость программы

enum Currency
{
RUR,
UAH,
USD,
}
class Money
{
public decimal Amount { get; set; }
public Currency Currency { get; private set; }

public Money(decimal amount, Currency currency)
{
Amount = Math.Round(amount,2);
Currency = currency;
}
public static Money operator +(Money m1, Money m2)
{
return m1.Currency == m2.Currency ? new Money(m1.Amount + m2.Amount, m1.Currency) : new Money(m1.Amount + Converter.Convert(m2, m1.Currency).Amount, m1.Currency);
}
public override string ToString()
{
return string.Format("{0,4:f} {1}", Amount, Currency);
}
public static bool operator ==(Money a, Money b)
{
if (a.Currency == b.Currency)
{
return a.Amount == b.Amount;
}
return a.Amount == Converter.Convert(b, a.Currency).Amount;
}
public static bool operator !=(Money a, Money b)
{
return !(a == b);
}
}
static class Converter
{
public static Money Convert(Money money, Currency currency)
{
return new Money(money.Amount * GetExchangeRate(money.Currency, currency), currency);
}
private static decimal GetExchangeRate(Currency currencyFrom, Currency currencyTo)
{
return GetExchangeRateRelativeToRUR(currencyFrom) / GetExchangeRateRelativeToRUR(currencyTo);
}
private static decimal GetExchangeRateRelativeToRUR(Currency type)
{
switch (type)
{
case Currency.RUR:
return 1;
case Currency.UAH:
return 2.7m;
case Currency.USD:
return 66.1m;
default:
throw new Exception("No exchage rate for " + type);
}
}
}

class Program
{
static void Main(string[] args)
{
Money uah = new Money(1, Currency.UAH);
Money uah2 = new Money(24.48m, Currency.UAH);
Money rur = new Money(1, Currency.RUR);
Money rur1 = new Money(1, Currency.RUR);
Money rur2 = new Money(2, Currency.RUR);
Money usd = new Money(1, Currency.USD);

Console.WriteLine(rur.Amount + " " + rur.Currency + "\n");
Console.WriteLine(Converter.Convert(rur, Currency.UAH));
Console.WriteLine(Converter.Convert(rur, Currency.USD));

Console.WriteLine("\n" + uah.Amount + " " + uah.Currency + "\n");
Console.WriteLine(Converter.Convert(uah, Currency.RUR));
Console.WriteLine(Converter.Convert(uah, Currency.USD));

Console.WriteLine("\n" + usd.Amount + " " + usd.Currency + "\n");
Console.WriteLine(Converter.Convert(usd, Currency.UAH));
Console.WriteLine(Converter.Convert(usd, Currency.RUR));

Console.WriteLine("\n" + "Суммирование денег" + "\n");
Console.WriteLine(uah + " + " + rur + " = " + (uah + rur));
Console.WriteLine(rur + " + " + usd + " + " + uah + " = " + (rur + usd + uah));
Console.WriteLine("\n" + "Сравнивание денег" + "\n");
Console.WriteLine(rur + (rur == rur1 ? " = " : " != ") + rur1);
Console.WriteLine(rur + (rur == rur2 ? " = " : " != ") + rur2);
Console.WriteLine(uah2 + (uah2 == usd ? " = " : " != ") + usd);
Console.WriteLine(rur + (rur == usd ? " = " : " != ") + usd);
Console.ReadKey();
}
}

Максим 13 фев 2015 09:31
AlexWolf
---
Условия очень часто меняются на практике, и лучше сразу продумывать гибкую систему, чтобы новые возможности программы можно было быстро и легко внедрить. Количество классов на скорость выполнения не влияет, а вот их реализация да.

AlexWolf 12 фев 2015 11:26
То есть я правильно понял, что поля нужны, в принципе, лишь для удобства написания кода и понятной структуризации? На скорость выполнения программы количество классов никак не сказывается (если программа большая)?
Когда я писал код, то не думал о том, что могут быть другие условия (больше валюты или банковские счета) Как-то на это я не рассчитывал. )
На счет перегрузки +... У меня в программу в принципе можно добавить любое количество валюты и перегрузку оператора + не нужно переписывать под каждую из них, так как поле курс у меня является отношением к наименьшей валюте. В данном примере к рублю. То есть любая валюта будет сначала конвертироваться в рубли по курсу, а потом выводиться в той валюте, в которой укажет пользователь.
Я пересмотрел все задачки, что выложили другие пользователи... я понимаю, что краткость - сестра таланта, но у них ни курс указать нельзя, ни денежные единицы поменять, ни в какой валюте сумму вывести. Курс же меняется каждый день, нельзя же его в коде каждый раз прописывать... У меня хоть код страшный, но хотя бы функционал программы полный и более гибкий. Буду проводить работу над ошибками, согласно вашим замечаниям, но если вы не против, то работать буду все-же с этим кодом. Спасибо за бдительность ))

Максим 11 фев 2015 13:05
AlexWolf
---
Я бы этот код удалил и забыл как страшный сон)

По поводу реализовать всё в одном классе. А если бы программа должна была работать с людьми, у которых имеется список банковских счетов в разных валютах, на которых есть деньги. Тогда что, назвать класс Money, и налепить туда полей массив валют, массив количеств денег, имя человека, массив номеров счетов, и все методы конвертации, перегрузку операторов? Зачем тогда вообще классы, можно всё в методе main сделать.

Вот если взять деньги, они характеризуются количеством и валютой. Вы добавили поле курс, но что это за курс, относительно чего? А если сделать больше валют, а не только две, сколько это кода будет в перегрузке "+".

Перегрузка "+" должны быть примерно такой:

public static Money operator +(Money a, Money b)
{
if (a.Valuta != b.Valuta)
return new Money(a.Amount + Converter.ConvertMoney(b, a.Valuta), a.Valuta);
return new Money(a.Amount + b.Amount, a.Valuta);
}
Класс конвертер должен быть похож на этот (автор pinguin-linuxoid), но это тоже далековато от того что надо:

public class C_M
{
public static Money Convet_Money(Money c, uint curs = 5)
{
if (c.Unit == "USD")
{
c.Amount *= curs;
c.Unit = "RUB";
}
else if (c.Unit == "RUB")
{
c.Amount /= curs;
c.Unit = "USD";
}
return new Money(c.Amount, c.Unit);
}
}
А с перегрузкой оператора "==" всё просто, он должен возвращать true тогда, когда деньги "a" и "b" одинаковой валюты и суммы, или когда разные валюты и привести "b" к валюте "a" их суммы будут одинаковыми. 5 рублей = 5 рублей, 1 доллар = 65 (взял курс 65) - в этих случаях true

AlexWolf 10 фев 2015 14:58
Добрый день admin! Замучился я что-то с этим уроком. С заданием не справился, можно сказать. Я конечно понял что такое перегрузка операторов и для чего она нужна, но в данной задаче так и не смог впихнуть куда нибудь перегрузку == и =!. Она у меня есть в коде, но никак не задействована. А ваше второе условие я не понял. Зачем создавать отдельный класс для конвертации, если ее можно в обычную функцию/метод определить? На что вообще влияет количество классов в коде и влияет ли? Если можно обойтись одним классом... Но программа работает, хоть и не совсем так, как вы хотели.
PS. Исключения не стал прописывать, так как код и так большой получился. Так что не стоит экспериментировать )))


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Money
{
public double Kolvo { get; set; }
public bool Valuta { get; set; }
public string Text { get; set; }
public double Kurs { get; set; }
public Money(double kolvo, bool valuta, string text, double kurs )
{
Kolvo = kolvo;
Valuta = valuta;
Text = text;
Kurs = kurs;
}
public static Money operator +(Money a, Money b)
{
if (a.Valuta && a.Valuta != b.Valuta)
{ return new Money((a.Kolvo * a.Kurs) + b.Kolvo, false, "", a.Kurs); }
else if (a.Valuta && a.Valuta == b.Valuta)
{ return new Money((a.Kolvo * a.Kurs) + (b.Kolvo * a.Kurs), false, "", a.Kurs); }
else if (!a.Valuta && a.Valuta != b.Valuta)
{ return new Money(a.Kolvo + (b.Kolvo * a.Kurs), false, "", a.Kurs); }
else { return new Money(a.Kolvo + b.Kolvo, false, "", a.Kurs); }
}
public static bool operator ==(Money a, Money b)
{
return (a.Valuta == b.Valuta && a.Valuta);
}
public static bool operator !=(Money a, Money b)
{
return !(a.Valuta == b.Valuta && !a.Valuta);
}
public void Operation(Money a)
{
Kolvo = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Выберите валюту: 1-рубль, 2-доллар.");
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.D1:
{
Valuta = false;
}
break;
case ConsoleKey.D2:
{
Valuta = true;
if (a.Kurs == 1)
{
Console.WriteLine("Введите курс доллара.");
a.Kurs = Convert.ToDouble(Console.ReadLine());
}
}
break;
default:
Console.WriteLine("Неверный номер валюты!");
break;
}
}
public void Kursss(Money a)
{
Console.WriteLine("Введите курс доллара.");
Kurs = Convert.ToDouble(Console.ReadLine());
}
class Program
{
static void Main(string[] args)
{
Money part1 = new Money(0,false,"",1);
Money part2 = new Money(0,false,"",1);
Console.WriteLine("Введите первое значение количества денежных средств.");
part1.Operation(part1);
Console.WriteLine("Введите второе значение количества денежных средств.");
part2.Operation(part1);
Money summa = new Money(0, false, "", 1);
summa = part1 + part2;
Console.WriteLine("Выберите валюту, в которой хотите получить сумму: 1-Рубли, 2-Доллары.");
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.D1:
{
summa.Valuta = false;
}
break;
case ConsoleKey.D2:
{
summa.Valuta = true;
if (part1.Kurs == 1)
{
Console.WriteLine("Введите курс доллара.");
part1.Kurs = Convert.ToDouble(Console.ReadLine());
}
}
break;
default:
Console.WriteLine("Неверный номер валюты!");
break;
}
if (!summa.Valuta)
{
Console.WriteLine("Сумма равна "+summa.Kolvo+" рублей.");
}
else if (summa.Valuta)
{
Console.WriteLine("Сумма равна " + summa.Kolvo / part1.Kurs + " $.");
}
else { Console.WriteLine("Неверный выбор валюты"); }
Console.ReadKey();
}

}
}
}

s3nger 30 янв 2015 21:02
namespace OverloadOperators
{
internal class Money
{
public double Amount { get; set; }
public string Valuta { get; set; }

public Money(string valuta, double amount)
{
Valuta = valuta;
Amount = amount;
}

public static Money operator +(Money a, Money b)
{
if (a.Valuta != b.Valuta)
{
Console.WriteLine("Error");
throw new Exception("Error1");
}

return new Money(a.Valuta, a.Amount + b.Amount);
}
}

internal class Convertator : Money
{
private static List<string> _valuta = new List<string>() {"UAH", "RUR", "EURO", "USD"};
private static List<double> _koefficient = new List<double> {1, 0.3, 22, 17};

public Convertator(string Valuta, double Amount) : base(Valuta, Amount)
{
this.Amount = Amount;
this.Valuta = Valuta;

}

public static double KoeffValuta(Convertator q)
{
string changeValuta = q.Valuta;
int indexValuta = _valuta.IndexOf(changeValuta);
double koeffValuta = _koefficient[indexValuta];
return koeffValuta;
}

public static double operator ==(Convertator q1, Convertator q2)
{
if (q1.Valuta == q2.Valuta)
{
return q1.Amount += q2.Amount;

}
return q1!=q2;
}


public static double operator !=(Convertator q1, Convertator q2)
{
double SummUAH = 0;
if (q1.Valuta != q2.Valuta)
{
var koeff1 = KoeffValuta(q1);
var koeff2 = KoeffValuta(q2);
SummUAH = koeff1*q1.Amount + koeff2*q2.Amount;
return SummUAH /= koeff1;
}
return q1==q2;
}

private class Program
{
private static void Main(string[] args)
{
Convertator americanMoney = new Convertator("USD", 100);
Convertator nationalMoney = new Convertator("UAH", 1700);
Convertator europaMoney = new Convertator("EURO", 90);
Convertator russiaMoney = new Convertator("RUR", 6700);
Console.WriteLine("Dollars:"+(americanMoney != nationalMoney));
Console.WriteLine(americanMoney == nationalMoney);
Console.WriteLine("Euro:" +(europaMoney!=nationalMoney));
Console.WriteLine(europaMoney==nationalMoney);
Console.WriteLine("Rubl:"+(russiaMoney!=russiaMoney));
Console.ReadLine();

}
}
}
}

pinguin-linuxoid 25 дек 2014 20:06
Доброго времени суток! Админ отметьте пожалуйста недостатки кода, у меня сомнения по поводу конвертации.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Lesson_25_operator_overload
{


public class C_M
{
public static Money Convet_Money(Money c, uint curs = 5)
{
if (c.Unit == "USD")
{
c.Amount *= curs;
c.Unit = "RUB";
}
else if (c.Unit == "RUB")
{
c.Amount /= curs;
c.Unit = "USD";
}
return new Money(c.Amount, c.Unit);
}
}



public class Money
{
public decimal Amount { get; set; }
public string Unit { get; set; }

public Money(decimal amount, string unit)
{ Amount = amount; Unit = unit; }


public static Money operator +(Money a, Money b) //перегрузка оператора «+»
{
if (a.Unit != b.Unit)
C_M.Convet_Money(b, 10);


return new Money(a.Amount + b.Amount, a.Unit);
}


public static bool operator ==(Money a, Money b)
{
if (a.Unit == b.Unit && a.Amount == b.Amount)
{
return true;
}
else
{
return false;
}
}

public static bool operator !=(Money a, Money b)
{
if (a.Unit != b.Unit || a.Amount != b.Amount)
{
return true;
}
else if (a.Unit == b.Unit && a.Amount == b.Amount)
{
return false;
}
else return true;
}

}


class Program
{
static void Main(string[] args)
{



Money myMoney = new Money(100, "USD");
Money yourMoney = new Money(100, "RUB");
Money hisMoney = new Money(50, "USD");
Money sum = myMoney + hisMoney; // 150 USD

Console.WriteLine(myMoney != yourMoney);




Console.ReadLine();


}
}
}

Диманиак 02 дек 2014 07:23
Также, можно сократить метод Course до
public double Course(Money a, Money b)
{
return b.Amount * Cources.ElementAt(Currencies.IndexOf(b.Unit)) / Cources.ElementAt(Currencies.IndexOf(a.Unit));
}

Диманиак 02 дек 2014 00:11
Можно было Amount и Unit сделать полями

Диманиак 02 дек 2014 00:09
Жду замечаний

namespace ConsoleApplicationTest
{
public class Converter
{
string BaseCurrency = "UAH";
List<string> Currencies = new List<string> { "UAH", "USD", "EUR", "RUR" };
List<double> Cources = new List<double> { 1.0, 15.7, 19.55, 0.319 };
public double Course(Money a, Money b)
{
if (a.Unit == BaseCurrency)
return b.Amount * Cources.ElementAt(Currencies.IndexOf(b.Unit));
else
return b.Amount * Cources.ElementAt(Currencies.IndexOf(b.Unit)) / Cources.ElementAt(Currencies.IndexOf(a.Unit));
}
}
public class Money
{
public double Amount { get; set; }
public string Unit { get; set; }
public Money(double amount, string unit)
{
Amount = amount;
Unit = unit;
}
public static bool operator ==(Money a, Money b)
{
return ((a.Amount == b.Amount) && (a.Unit == b.Unit));
}
public static bool operator !=(Money a, Money b)
{
return ((a.Amount != b.Amount) || (a.Unit != b.Unit));
}
public static Money operator +(Money a, Money b)
{
if (a != b)
return new Money(a.Amount + new Converter().Course(a, b), a.Unit);
else
return new Money(a.Amount + b.Amount, a.Unit);
}
public static string operator +(string text, Money a)
{
return text + a.Amount + " " + a.Unit;
}
}
class Program
{
static void Main(string[] args)
{
Money myMoney = new Money(100, "USD");
Console.WriteLine("У меня сейчас " + myMoney); // "У меня сейчас UAH USD"
Money yourMoney = new Money(100, "EUR");
Console.WriteLine("У тебя сейчас " + yourMoney); // "У тебя сейчас 100 EUR"
Money ourMoney = myMoney + yourMoney;
Console.WriteLine("У нас сейчас " + ourMoney); // "У нас сейчас ..."
Console.ReadLine();
}
}

Максим 25 окт 2014 18:18
why_not
---
Те же недочеты, что и ниже в комментариях:

Слишком сложный код:
if (a.Amount == b.Amount) return true;
else return false;

Достаточно:

return a.Amount == b.Amount;

Операторы == и != перегружены одинаково, второй должен был выглядить так:
public static bool operator !=(Money a, Money b)
{
return !(a == b);
}

Ну и у вас вся валюта приводится к рублям. Предпологалось, что конвертирующий метод будет приводить деньги к валюте, что левее от операции "+"

why_not 25 окт 2014 00:37
Очень сыро, сам вижу. Даже выкладывать стыдно. Жду замечаний по поводу ошибок конкретно этого урока(в 1ю очередь), т.к. мог задание понять некорректно. Ну и по поводу синтаксиса, соответсвенно))

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace ConsoleApplication1
{



public class Money
{
public double Amount { get; set; }
public string Unit { get; set; }
public Money(double amount, string unit)
{
Amount = amount;
Unit = unit;
}
public static Money Convertt(Money a)
{
if (a.Unit == "RUR") return new Money(a.Amount, a.Unit);
if (a.Unit == "USD") return new Money(40*a.Amount, a.Unit);
if (a.Unit == "EUR") return new Money(50*a.Amount, a.Unit);
else return new Money(a.Amount = 0, a.Unit = "Failure curreny");
}
public static Money operator +(Money a, Money b)
{
if (a.Unit == b.Unit )
return new Money(a.Amount + b.Amount, a.Unit);
else
{
b = Convertt(b);
a = Convertt(a);
return new Money(a.Amount + b.Amount, "RUR");
}
}
public static bool operator ==(Money a, Money b)
{

if (a.Unit != b.Unit)
{
a = Convertt(a);
b = Convertt(b);
}
if (a.Amount == b.Amount) return true;
else return false;

}
public static bool operator !=(Money a, Money b)
{

if (a.Unit != b.Unit)
{
a = Convertt(a);
b = Convertt(b);
}
if (a.Amount == b.Amount) return true;
else return false;

}
public static string operator +(string text, Money a)
{
return text + a.Amount + " " + a.Unit;
}
}
class Program
{
public static void Main(string[] args)
{
Money yourMoney = new Money(40, "EUR");
Money myMoney = new Money(50, "USD");
Money sum = yourMoney + myMoney;
Console.WriteLine("We have now " + sum);
if (yourMoney == myMoney) Console.WriteLine("equally");
else Console.WriteLine("differently");
Console.ReadLine();
}
}
}

Максим 14 окт 2014 20:52
mumm
---
public static Convert operator -(Money a, Money b) - здесь нужно возвращать Money, а не Convert:
public static Money operator -(Money a, Money b)

mumm 14 окт 2014 17:01
Подскажите почему не получается реализовать оператор - в классе Convert, а в классе Money получается.


class Money
{
public double Kolichestvo { get; set; }

public string Valyta { get; set; }


public Money(double kolichestvo, string valyta)
{
Kolichestvo = kolichestvo;
Valyta = valyta;
}


}

class Convert
{
public decimal Amount { get; set; }
public string Unit { get; set; }

public Convert(decimal amount, string unit)
{
Amount = amount;
Unit = unit;
}

public static Convert operator -(Money a, Money b)
{
if (a.Valyta == "USD")
a.Kolichestvo=a.Kolichestvo * 40.33;
a.Valyta ="RUS";
if (b.Valyta == "USD")
b.Kolichestvo = b.Kolichestvo * 40.33;
b.Valyta = "RUS";

return new Money(a.Kolichestvo + b.Kolichestvo, a.Valyta);
}
}

Максим 02 сен 2014 17:14
beronny
---
Используется в операторе +
return new Money(Convertor.MoneyConvertor(a, b), a.Unit, a.Kurs);

Если суммируются деньги в разных валютах, этот метод приводит деньги к одной валюте


beronny 02 сен 2014 16:07
АДМИН! я вот смотрю программу Serj 31 май 2014 15:50
и не понимаю, зачем вот эта часть программы, по идее тут нигде она не используется! Объясни плз!

public class Convertor
{
public static decimal MoneyConvertor(Money a, Money b)
{

decimal z = ( a.Amount + b.Amount * b.Kurs / a.Kurs);
return z;

}
}

Кот Тимофей 20 июн 2014 06:26
Я правильно понимаю, что порядок операторов важен для перегрузок операторов, как и для обычных функций?
Т.е. если у нас есть перегрузка

public static string operator +(string text, Money a){}

то строчка

Console.WriteLine(myMoney + "Text");

Всё равно выдаст ошибку? А впрочем чего я спрашиваю, сейчас посмотрю)

Максим 02 июн 2014 17:56
Serj
---
Лишний код:
if (a.Unit == b.Unit)
return true;
else return false;
Проще так:
return a.Unit == b.Unit;

Serj 31 май 2014 15:50
Если я правильно понял задание(а это было не просто). Вот мое решение.

public class Convertor
{
public static decimal MoneyConvertor(Money a, Money b)
{

decimal z = ( a.Amount + b.Amount * b.Kurs / a.Kurs);
return z;

}
}


public class Money
{
public decimal Amount { get; set; }
public string Unit { get; set; }
public decimal Kurs { get; set; }

public Money(decimal amount, string unit, decimal kurs)
{
Amount = amount;
Unit = unit;
Kurs = kurs;
}
public static Money operator +(Money a, Money b)
{
if (a.Unit != b.Unit)
{
return new Money(Convertor.MoneyConvertor(a, b), a.Unit, a.Kurs);
}

return new Money(a.Amount + b.Amount, a.Unit, a.Kurs);
}

public static bool operator ==(Money a, Money b)
{
if (a.Unit == b.Unit)
return true;
else return false;
}
public static bool operator !=(Money a, Money b)
{
if (a.Unit != b.Unit)
return true;
else return false;
}

}
class Program
{
static void Main(string[] args)
{
Money myMoney = new Money(100, "USD", 6);
Money yourMoney = new Money(100, "RUR", 2);
Money hisMoney = new Money(50, "USD", 6);
Money sum = myMoney + hisMoney; // 150 USD
Console.WriteLine(sum.Amount);
sum = yourMoney + hisMoney;
Console.WriteLine(sum.Amount);
Console.WriteLine(yourMoney == hisMoney ?"Это одинаковая валюта" : "Это разная валюта" );
Console.ReadLine();
}
}

Максим 28 май 2014 14:37
dimasik
---
Хорошо, только не пишите в таком стиле:

if (a == b)
{
return false;
}
else
{
return true;
}

Можно же ведь одной строкой:

return !(a == b);

Максим 28 май 2014 14:25
Ромик
---
Ой не то. Операторы равенства "==" и "!=" должны возвращать тип bool, а не строку, оператор "+" должен возвращать в этом случае объект Money, а не строку

dimasik 28 май 2014 13:42
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace peregruzOperators
{
class Cash
{
public double amount;
public string unit;
public double kurs;


public override string ToString()
{
return amount.ToString() + " " + unit;
}
public Cash(double amount, string unit, double kurs)
{
this.amount = amount;
this.unit = unit;
this.kurs = kurs;
}
public static Cash operator +(Cash a, Cash b)
{
if (a.unit != b.unit)
{
return new Cash(a.amount + b.amount * b.kurs / a.kurs, a.unit, a.kurs);
}
else
{
return new Cash(a.amount+ b.amount,a.unit,a.kurs);
}
}

public static bool operator ==(Cash a, Cash b)
{

if (a.unit != b.unit)
{
if (a.amount * a.kurs == b.amount * b.kurs)
{
return true;
}
else
{
return false;
}
}
else if ((a.unit == b.unit)&&(a.amount==b.amount))
{
return true;
}
else
{
return false;
}
}


public static bool operator !=(Cash a, Cash b)
{
if (a==b)
{
return false;
}
else
{
return true;
}
}
}

class Program
{
static void Main(string[] args)
{
Cash cash1 = new Cash(120, "UAH", 1);
Cash cash2 = new Cash(10, "EUR", 12);
Cash cash3 = new Cash(8.2, "USD", 3);
Cash cash4 = new Cash(5.25, "USD", 3);
Cash myCash = cash1 + cash2;
Cash myCash2 = cash3 + cash4;
Console.Write(cash1.amount+" " + cash1.unit+ " + "+ cash2.amount + " " + cash2.unit + " = ");
Console.WriteLine(Math.Round(myCash.amount,2) + " " +myCash.unit);
Console.Write(cash3.amount + " " + cash3.unit + " + " + cash4.amount + " " + cash4.unit + " = ");
Console.WriteLine(Math.Round(myCash2.amount, 2) + " " + myCash2.unit);
if (cash1==cash2)
{
Console.WriteLine(cash1 + " Равноценно " + cash2 );
}
else
{
Console.WriteLine(cash1 + " Не равноценно " + cash2 );
}
if (cash3==cash4)
{
Console.WriteLine(cash3 + " Равноценно " + cash4 );
}
else
{
Console.WriteLine(cash3 + " Не равноценно " + cash4 );
}
Console.ReadKey();


}
}
}

Ромик 27 май 2014 10:53
public static string operator !=(Money a, Money b)
{
if (a.Unit != b.Unit)
return "Разные деньги";
return "Все в ажуре";
}

Ромик 27 май 2014 10:23
public class Money // Выводит что то про метод Equals(); (подчеркнуто зеленым)
{
double Amount { get; set; }
string Unit { get; set; }
public Money(double amount, string unit)
{
Amount = amount;
Unit = unit;
}

public static string operator ==(Money a, Money b)
{
if (a.Unit == b.Unit)
return a.Amount+b.Amount + " " + a.Unit;
else if (a.Unit == "USD")
return Convert.ToString(a.Amount + b.Amount / 30 + " " + a.Unit);
return Convert.ToString(a.Amount + b.Amount*30 + " " + a.Unit);
}

public static Money operator !=(Money a, Money b)
{
!= = ==; // Вообще какая то чушь!!! Хочу чтобы когда введено != ссылалось на ==
} //Void сделать нельзя(чтобы оставить все пустым)
// А вот когда сюда копировал из коментариев (исключительно !=) все работало

public static string operator +(string a, Money b)
{
return a + b.Amount + " " + b.Unit;
}
}
class Program
{
static void Main(string[] args)
{
Money money = new Money(100, "USD");
Money money1 = new Money(50, "RUR");
Console.WriteLine("У меня сейчас " + money);
Console.WriteLine("А вот у Семена " + money1);
Console.WriteLine("Вместе у нас " + (money1 == money));
Console.ReadKey();
}
}

Максим 11 мар 2014 03:49
Никита
---
Уже ближе, но есть серьезная ошибка. "==" это оператор сравнения, он должен возвращать результат только в типе bool, никак не строку. А для оператора "!=" не нужно писать ту же проверку, достаточно воспользоваться уже перегруженым оператором "==" с отрицанием:

return !(a == b);

Никита 11 мар 2014 01:15
Тогда так: это в классе:

------

public static string operator ==(Money a, Money b)
{
if (a.Unit == b.Unit && a.Amount == b.Amount)
return "Введённые суммы одинаковы.";
else return "Введённые суммы различны.";
}
public static string operator !=(Money a, Money b)
{
if (a.Unit != b.Unit || b.Amount != a.Amount)
return "Введённые суммы различны.";
else return "Введённые суммы одинаковы.";
}

------
А это в программе:
------


Console.WriteLine(newMoney == newMoney2);
Console.WriteLine(newMoney != newMoney2);

----
Остаётся один вопрос - зачем нужно обозначать и "==" и "!="? Если удалить один, другой действительно не работает, но смысла я в этом не нахожу.

Максим 11 мар 2014 00:46
Никита
---
То, что выводит сумму в той валюте, что первая это нормально. А вот оператор "==" вы конечно не так перегрузили. Он должен возвращать true, когда деньги равны (одинаковая валюта и количество). Оба входящих параметра - объекты Money, и дальше нужно сравнить количества и валюты

Никита 11 мар 2014 00:36
Я уже не стал на сонную голову обрабатывать исключения при вводе сумм и типа валюты. Тут выходит, что программа выводит сумму в той валюте, которая введена первой, это правильно? И ещё - как можно использовать в данном случае перегрузку "!=" и "==" более адекватно, чем это сделал я?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication37
{
public class Money
{
public double Amount { get; set; }
public string Unit { get; set; }
public const double CurrencyRate = 36.26f;
public Money (double amount, string unit)
{
Amount = amount;
Unit = unit;
}
public static double ConvertCurrency(string unit1, double amount2)
{
if (unit1 == "USD")
amount2 /= CurrencyRate;
else if (unit1 == "RUR")
amount2 *= CurrencyRate;
return amount2;
}
public static Money operator +(Money a, Money b)
{
if (a.Unit != b.Unit)
b.Amount = Money.ConvertCurrency(a.Unit, b.Amount);
return new Money(a.Amount + b.Amount, a.Unit);
}
public static string operator +(string text, Money a)
{
return text + a.Amount + " " + a.Unit;
}
public static string operator ==(string text, Money a)
{
return text + "перегружен оператор \"==\", вот как.";
}
public static string operator !=(string text, Money a)
{
return text + "перегружен оператор \"!=\", вот так вот.";
}
}
class Program
{
static void Main(string[] args)
{
double NewAmount;
string UnitType;
Console.WriteLine("Enter the amount:");
NewAmount = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter the type of unit, USD or RUR:");
UnitType = Convert.ToString(Console.ReadLine());
Money newMoney = new Money(NewAmount, UnitType);
Console.WriteLine("Enter the second amount:");
NewAmount = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Enter the type of the second unit, USD or RUR:");
UnitType = Convert.ToString(Console.ReadLine());
Money newMoney2 = new Money(NewAmount, UnitType);
Money myMoney = new Money(100, "USD");
Money yourMoney = new Money(100, "RUR");
Money hisMoney = new Money(50, "USD");
Money sum = newMoney + newMoney2;
Console.WriteLine("У вас сейчас " + sum);
Console.WriteLine("У вас сейчас " == sum);
Console.WriteLine("У вас сейчас " != sum);
Console.ReadKey();
}
}
}


Добавить комментарий:

Имя (обязат.)
E-mail (обязат., не публикуется)


Для вставки ваших программ пользуйтесь кнопкой "исходный код"
Вёрстка сайта с нуля

Уникальный Видеокурс!

"Научись верстать сайты и заработай на этом!"

Получить видеокурс

Подпишись на курс по программированию, и узнавай первым о новых уроках!

RSS подписка Страничка Вконтакте Мы в Twitter

Ошибка в тексте? Выделите ее мышкой и нажмите Ctrl+Enter
Поблагодарить автора: Номер карты (ПриватБанк)
5168 7572 4170 8660
WebMoney
R372544961915 U685637142028 Z999792764387
Наверх
Система Orphus