|
Программирование >> Обработка исключительных ситуаций
Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации. Если программист не указал ни одного конструктора или какие-то поля не были инициализированы, полям значимых типов присваивается нуль, полям ссылочных типов - значение null. J Конструктор, вызываемый без параметров, называется конструктором по умолчанию. До сих пор мы задавали начальные значения полей класса при описании класса см., например, листинг 5.1). Это удобно в том случае, когда для всех экземпляров класса начальные значения некоторого поля одинаковы. Если же при создании юъектов требуется присваивать полю разные значения, это следует делать в кон-;трукторе. В листинге 5.6 в класс Demo добавлен конструктор, а поля сделаны закрытыми (ненужные в данный момент элементы опущены). В программе создаются два объекта с различными значениями полей. Листинг 5.6. Класс с конструктором ..s-ng System; =mespace ConsoleApplicationi class Demo public Demo( int a, double у ) { this.а this.у = а; = у: конструктор с параметрами public double GetyO метод получения поля у return у; int а; double у; class Classl static void MainO Demo a = new Demo( 300, 0.002 ) Console.WriteLineC a.GetyO ): Demo b = new Demo( 1, 5.71 ); Console.WriteLineC b.GetyO ); вызов конструктора результат; 0,002 вызов конструктора результат: 5,71 Часто бывает удобно задать в классе несколько конструкторов, чтобы обеспечить возможность инициализации объектов разными способами. Следующий пример несколько притянут за уши , но тем не менее иллюстрирует этот тезис: class Demio public roC int a ) { this.a = a: this.у = 0.002; конструктор 1 public Demo( double у ) конструктор 2 this.a this.у Dno x = new Demo( 300 ); Dno у = new ncC 5.71 ); вызов конструктора 1 вызов конструктора 2 Все конструкторы должны иметь разные сигнатуры. Если один из конструкторов выполняет какие-либо действия, а другой должен делать то же самое плюс еще что-нибудь, удобно вызвать первый конструктор из второго. Для этого используется уже известное вам ключевое слово this в другом контексте, например: class Demo public DemoC int a ) { this.a конструктор 1 public DemoC int a, double у ) : thisC a ) вызов конструктора 1 this.у Конструкция, находящаяся после двоеточия, называется инициализатором, то есть тем кодом, который исполняется до начала выполнения тела конструктора. Как вы помните, все классы в С# имеют общего предка - класс object. Конструктор любого класса, если не указан инициализатор, автоматически вызывает конструктор своего предка. Это можно сделать и явным образом с помощью ключевого слова base, обозначающего конструктор базового класса. Таким образом, первый конструктор из предыдущего примера можно записать и так: public DemoC int а ) : baseC) { конструктор 1 this.а ПРИМЕЧАНИЕ - Конструктор базового класса вызывается явным образом в тех случаях, когда ему требуется передать параметры. До сих пор речь шла об обычных конструкторах, или конструкторах экземп-.лра. Существует второй тип конструкторов - статические конструкторы, или конструкторы класса. Конструктор экземпляра инициализирует данные экземпляра, конструктор класса - данные класса. Статический конструктор не имеет параметров, его нельзя вызвать явным образом. Система сама определяет момент, в который требуется его выполнить. Гарантируется только, что это происходит до создания первого экземпляра объекта и до вызова любого статического метода. Некоторые классы содержат только статические данные, и, следовательно, созда-зать экземпляры таких объектов не имеет смысла. Чтобы подчеркнуть этот факт, з первой версии С# описывали пустой закрытый (private) конструктор. Это предотвращало попытки создания экземпляров класса. В листинге 5.7 приведен пример класса, который служит для группировки величин. Создавать экземпляры этого класса запрещено. Листинг 5.7. Класс со статическим и закрытым конструкторами (для версий ниже 2.0) .sing System; STiespace Consol eAppl ication i class { private DC){} static DC) закрытый конструктор II статический конструктор a = 200; static int a: static double public static b = 0.002; void PrintC) Console.WriteLineC Console.WriteLineC a = b = + a ); + b );
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |