Тверской государственный университет
Опубликован: 22.11.2005 | Доступ: свободный | Студентов: 30517 / 1907 | Оценка: 4.31 / 3.69 | Длительность: 28:26:00
ISBN: 978-5-9556-0050-5
Лекция 16:

Классы

Константы класса Rational

Рассмотрим важную проблему определения констант в собственном классе. Определим две константы 0 и 1 класса Rational. Кажется, что сделать это невозможно из-за ограничений, накладываемых на объявление констант. Напомню, константы должны быть инициализированы в момент объявления, и их значения должны быть заданы константными выражениями, известными в момент компиляции. Но в момент компиляции у класса Rational нет никаких известных константных выражений. Как же быть? Справиться с проблемой поможет статический конструктор, созданный для решения подобных задач. Роль констант класса будут играть статические поля, объявленные с атрибутом readonly, то есть доступные только для чтения. Нам также будет полезен закрытый конструктор класса. Еще укажем, что введение констант класса требует использования экзотических средств языка C#. Вначале определим закрытый конструктор:

private Rational(int a, int b, string t)
{
	m = a; n = b;
}

Не забудем, что при перегрузке методов (в данном случае конструкторов ) сигнатуры должны различаться, и поэтому пришлось ввести дополнительный аргумент t для избежания конфликтов. Поскольку конструктор закрытый, то гарантируется корректное задание аргументов при его вызове. Определим теперь константы класса, которые, как я уже говорил, задаются статическими полями с атрибутом readonly:

//Константы класса 0 и 1 - Zero и One
		public static readonly Rational Zero, One;

А теперь зададим статический конструктор, в котором определяются значения констант:

static Rational()
{
	Console.WriteLine("static constructor Rational");
	Zero = new Rational(0, 1, "private");
	One = new Rational (1, 1, "private");
}//Статический конструктор

Как это все работает? Статический конструктор вызывается автоматически один раз до начала работы с объектами класса. Он и задаст значения статических полей Zero, One, представляющих рациональные числа с заданным значением. Поскольку эти поля имеют атрибут static и readonly, то они доступны для всех объектов класса и не изменяются в ходе вычислений, являясь настоящими константами класса. Прежде чем привести пример работы с константами, давайте добавим в наш класс важные булевы операции над рациональными числами - равенство и неравенство, больше и меньше. При этом две последние операции сделаем перегруженными, позволяя сравнивать рациональные числа с числами типа double:

public static bool operator ==(Rational r1, Rational r2)
{
	return((r1.m ==r2.m)&& (r1.n ==r2.n));
}
	public static bool operator !=(Rational r1, Rational r2)
{
	return((r1.m !=r2.m)|| (r1.n !=r2.n));
}
	public static bool operator <(Rational r1, Rational r2)
{
	return(r1.m * r2.n < r2.m* r1.n);
}
	public static bool operator >(Rational r1, Rational r2)
{
	return(r1.m * r2.n > r2.m* r1.n);
}
public static bool operator <(Rational r1, double r2)
{
	return((double)r1.m / (double)r1.n < r2);
}
public static bool operator >(Rational r1, double r2)
{
	return((double)r1.m / (double)r1.n > r2);
}

Наш последний пример демонстрирует работу с константами, булевыми и арифметическими выражениями над рациональными числами:

public void TestRationalConst()
{
	Rational r1 = new Rational(2,8), r2 =new Rational(2,5);
	Rational r3 = new Rational(4, 10), r4 = new Rational(3,7);
	Rational r5 = Rational.Zero, r6 = Rational.Zero;
	if ((r1 != Rational.Zero) && (r2 == r3))r5 = 
		(r3+Rational.One)*r4;
	r6 = Rational.One + Rational.One;
	r1.PrintRational("r1: (2,8)"); 
	r2.PrintRational ("r2: (2,5)");
	r3.PrintRational("r3: (4,10)"); 
	r4.PrintRational("r4: (3,7)");
	r5.PrintRational("r5: ((r3 +1)*r4)"); 
	r6.PrintRational("r6: (1+1)");
}

Результаты работы этого примера показаны на рис. 16.6.

Константы и выражения типа Rational

Рис. 16.6. Константы и выражения типа Rational
Александр Галабудник
Александр Галабудник

Не обнаружил проекты, которые используются в примерах в лекции, также не увидел список задач.

Александра Гусева
Александра Гусева

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.3349104289856watchdog( )../bootstrap.inc:0
24.3355104292304module_invoke( )../bootstrap.inc:967
34.3355104294160call_user_func_array ( )../module.inc:462
44.3355104294496devel_watchdog( )../module.inc:462
54.3358104295344decode_entities( )../devel.module:382
64.3358104297264drupal_error_handler( )../devel.module:340
74.3359104300888watchdog( )../common.inc:663
84.3359104302936module_invoke( )../bootstrap.inc:967
94.3359104304792call_user_func_array ( )../module.inc:462
104.3359104305128devel_watchdog( )../module.inc:462
114.3360104305824decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.3349104289856watchdog( )../bootstrap.inc:0
24.3355104292304module_invoke( )../bootstrap.inc:967
34.3355104294160call_user_func_array ( )../module.inc:462
44.3355104294496devel_watchdog( )../module.inc:462
54.3358104295344decode_entities( )../devel.module:382
64.3358104297264drupal_error_handler( )../devel.module:340
74.3359104300888watchdog( )../common.inc:663
84.3359104302936module_invoke( )../bootstrap.inc:967
94.3359104304792call_user_func_array ( )../module.inc:462
104.3359104305128devel_watchdog( )../module.inc:462
114.3360104305824decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.3349104289856watchdog( )../bootstrap.inc:0
24.3355104292304module_invoke( )../bootstrap.inc:967
34.3355104294160call_user_func_array ( )../module.inc:462
44.3355104294496devel_watchdog( )../module.inc:462
54.3358104295344decode_entities( )../devel.module:382
64.3376104297456drupal_error_handler( )../devel.module:340
74.3377104301144watchdog( )../common.inc:663
84.3377104303192module_invoke( )../bootstrap.inc:967
94.3377104305048call_user_func_array ( )../module.inc:462
104.3377104305384devel_watchdog( )../module.inc:462
114.3378104306160decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.3349104289856watchdog( )../bootstrap.inc:0
24.3355104292304module_invoke( )../bootstrap.inc:967
34.3355104294160call_user_func_array ( )../module.inc:462
44.3355104294496devel_watchdog( )../module.inc:462
54.3358104295344decode_entities( )../devel.module:382
64.3376104297456drupal_error_handler( )../devel.module:340
74.3377104301144watchdog( )../common.inc:663
84.3377104303192module_invoke( )../bootstrap.inc:967
94.3377104305048call_user_func_array ( )../module.inc:462
104.3377104305384devel_watchdog( )../module.inc:462
114.3378104306160decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.3389104290400watchdog( )../bootstrap.inc:0
24.3389104292448module_invoke( )../bootstrap.inc:967
34.3389104294304call_user_func_array ( )../module.inc:462
44.3389104294640devel_watchdog( )../module.inc:462
54.3389104295344decode_entities( )../devel.module:382
64.3389104297264drupal_error_handler( )../devel.module:340
74.3390104300872watchdog( )../common.inc:663
84.3390104302920module_invoke( )../bootstrap.inc:967
94.3390104304776call_user_func_array ( )../module.inc:462
104.3390104305112devel_watchdog( )../module.inc:462
114.3390104305808decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.3389104290400watchdog( )../bootstrap.inc:0
24.3389104292448module_invoke( )../bootstrap.inc:967
34.3389104294304call_user_func_array ( )../module.inc:462
44.3389104294640devel_watchdog( )../module.inc:462
54.3389104295344decode_entities( )../devel.module:382
64.3389104297264drupal_error_handler( )../devel.module:340
74.3390104300872watchdog( )../common.inc:663
84.3390104302920module_invoke( )../bootstrap.inc:967
94.3390104304776call_user_func_array ( )../module.inc:462
104.3390104305112devel_watchdog( )../module.inc:462
114.3390104305808decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.3389104290400watchdog( )../bootstrap.inc:0
24.3389104292448module_invoke( )../bootstrap.inc:967
34.3389104294304call_user_func_array ( )../module.inc:462
44.3389104294640devel_watchdog( )../module.inc:462
54.3389104295344decode_entities( )../devel.module:382
64.3395104297456drupal_error_handler( )../devel.module:340
74.3395104301144watchdog( )../common.inc:663
84.3395104303192module_invoke( )../bootstrap.inc:967
94.3395104305048call_user_func_array ( )../module.inc:462
104.3395104305384devel_watchdog( )../module.inc:462
114.3396104306160decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.3389104290400watchdog( )../bootstrap.inc:0
24.3389104292448module_invoke( )../bootstrap.inc:967
34.3389104294304call_user_func_array ( )../module.inc:462
44.3389104294640devel_watchdog( )../module.inc:462
54.3389104295344decode_entities( )../devel.module:382
64.3395104297456drupal_error_handler( )../devel.module:340
74.3395104301144watchdog( )../common.inc:663
84.3395104303192module_invoke( )../bootstrap.inc:967
94.3395104305048call_user_func_array ( )../module.inc:462
104.3395104305384devel_watchdog( )../module.inc:462
114.3396104306160decode_entities( )../devel.module:382