C# для профессионалов. Том II
Шрифт:
Public Property Get EmployeeName As String
EmployeeName = mStrEmployeeName
End Property
Public Sub Create(sEmployeeName As String, curSalary As Currency)
mStrEmployeeName = sEmployeeName
mCurSalary = curSalary
End Sub
Public Function GetMonthlyPayment As Currency
GetMonthlyPayment = mCurSalary/12
End Function
В
EmployeeName
предназначено только для чтения. Это по-прежнему оставляет необходимость задавать имя в первый раз. Для этого добавлен метод Create
, который определяет имя и зарплату. Таким образом, процесс создания объекта сотрудника будет выглядеть так: Dim Britney As Employee
Set Britney = New Employee
Britney.Create "Britney Spears", 20000
Эта схема работает, но она не очень удобна. Проблема с инициализацией объекта
Employee
состоит в том, что хотя VB предоставляет для этой цели методы Class_Load
и Class_Initialize
, метод Class_Load
не может получать никаких параметров. Это означает, что нельзя выполнить никакой инициализации, которая является специфической для данного экземпляра Employee
, поэтому необходимо просто написать отдельный метод инициализации Create
и надеяться, что все, кто пишет клиентский код, никогда не будут забывать его вызывать. Такое решение неудобно, так как нет никакого смысла иметь объект Employee
, у которого не заданы имя и зарплата, но именно это присутствует в приведенном выше коде в течение короткого периода между созданием экземпляра Britney
и инициализацией объекта. Пока будут помнить о вызове метода Create
, все будет нормально, но здесь имеется потенциальный источник ошибок. В C# ситуация совершенно другая. Здесь в конструкторы можно подставлять параметры (эквивалент в C# для метода
Class_Load
). Необходимо только убедиться, что при определении класса Employee
в C# конструктор получает Name
и Salary
в качестве параметров. В C# можно будет написать: Employee Britney = new Employee("Britney Spears", 20000.00M);
что значительно изящнее и менее подвержено ошибкам. Отметим кстати символ "
М
", добавленный к зарплате. Это связано с тем, что эквивалент C# для типа Currency
из VB называется десятичным значением и 'M
', добавленный к числу в C#, подчеркивает, что число надо интерпретировать как decimal
. Его указывать не обязательно, но это полезно для дополнительной проверки во время компиляции. Класс Employee в C#
Помня о приведенных выше замечаниях можно теперь представить первое определение версии C# класса
Employee
(отметим, что здесь показано определение класса, а не определение содержащего его пространства имен): class Employee {
private readonly string name;
private decimal salary;
public Employee(string name, decimal salary) {
this.name = name;
this.salary = salary;
}
public string Name {
get {
return name;
}
}
public virtual decimal Salary {
get {
return salary;
}
set {
salary = value;
}
}
public decimal GetMonthlyPayment {
return salary/12;
}
public override string ToString {
return "Name: " + name + ", Salary: $" + salary.ToString;
}
}
Просматривая
name
помечено как readonly
. Мы скоро узнаем его точное значение. Грубо говоря, это гарантирует, что данное поле задано, когда создавался объект Employee
, и не может впоследствии изменяться. В C# обычно не используют "венгерский" стиль именования объектов для имен переменных, поэтому они просто называются name
и salary
, а не mStrEmployeeName
и mCurSalary
. "Венгерский" стиль именования объектов означает, что имена переменных имеют префикс из букв, который указывает их тип (mStr
, mCur
и т.д.). Это на сегодня неважно, так как редакторы являются более развитыми и могут автоматически предоставить информацию о типах данных. Поэтому рекомендуется не использовать "венгерский" стиль именования объектов в программах C#. В классе
Employee
существует также конструктор, пара свойств — Name
и Salary
, а также два метода — GetMonthlyPayment
и ToString
. Все это будет рассмотрено далее. Отметим кстати, что имена свойств
Name
и Salary
отличаются только регистром символов от имен своих соответствующих полей. Это не является проблемой, так как C# различает регистр символов. Способ, которым здесь именованы свойства и поля, соответствует обычному соглашению в C# и показывает, как можно на самом деле воспользоваться различием регистра символов. Конструктор Employee
После объявления полей в приведенном выше коде располагается "метод", имя которого —
Employee
, совпадает с именем класса, то есть перед нами находится конструктор. Однако этот конструктор получает параметры и делает то же самое, что и метод Create
в версии VB — он использует параметры для инициализации полей-членов: public Employee(string name, decimal salary) {
this.name = name;
this.salary = salary;
}
Существует потенциальная синтаксическая проблема, так как явные имена параметров совпадают с именами полей —
name
и salary
. Но она разрешается с помощью использования ссылки this
, помечающей поля. Можно было бы вместо этого дать параметрам другие имена, но способ, которым это было сделано, является достаточно ясным и означает, что параметры сохраняют очевидные простые имена, которые соответствуют их значениям. Это обычный способ действий для C# в таких ситуациях.
Поделиться:
Популярные книги
Путь Чести
3. Жизни Архимага
Фантастика:
фэнтези
боевая фантастика
6.43
рейтинг книги
Идеальный мир для Социопата 3
3. Социопат
Фантастика:
боевая фантастика
6.17
рейтинг книги
Кротовский, не начинайте
2. РОС: Изнанка Империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Под маской моего мужа
Любовные романы:
современные любовные романы
5.67
рейтинг книги
Элита элит
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Вперед в прошлое 3
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Темный Патриарх Светлого Рода 5
5. Темный Патриарх Светлого Рода
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 8
8. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Менталист. Революция
3. Выиграть у времени
Фантастика:
боевая фантастика
5.48
рейтинг книги
Маршал Советского Союза. Трилогия
Маршал Советского Союза
Фантастика:
альтернативная история
8.37
рейтинг книги
Штурм Земли
8. Пробуждение Системы
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Баоларг
12. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Измена. Верну тебя, жена
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Законы Рода. Том 6
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00