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
wegorcag 07 фев 2017 21:47
Ведущая компания в России и странах СНГ по продаже авиабилетов «Airline-online»

Крупнейшая международная компания по продаже А/В билетов
срочно набирает сотрудников на постоянную основу для несложной
работы через интернет, с ежедневными выплатами от 11 000 руб.

Работая в нашей компании Вы получаете:

- Соблюдение трудового кодекса
- Полный соцпакет, оплачиваемый отпуск, больничный, санаторий.
- Высокий доход
- Каждый наш сотрудник на дому гарантированно получает от 11 000 руб. в день.
- Гарантированные стабильные выплаты заработанных денег.
- Выплаты происходят ежедневно на банковские карты или электронные кошельки.

Пройдите регистрацию у нас на сайте. ( www.poisk-rabota.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
Бесплатный курс по основам PHP
Ошибка в тексте? Выделите ее мышкой и нажмите Ctrl+Enter
Поблагодарить автора: Номер карты (ПриватБанк)
5168 7572 4170 8660
WebMoney
R372544961915 U685637142028 Z999792764387
Наверх
Система Orphus