Tutorial Lab One - Inheritance
Trong Lab này, bạn sẽ thực hành sử dụng tính kế thừa để liên kết các lớp với nhau. Là một nhà phát triển, việc có thể quyết định các lớp nào nên mở rộng, triển khai hoặc trừu tượng các đoạn mã cụ thể sẽ tối đa hóa việc chia sẻ mã của bạn.
Chúng tôi sẽ tạo ra một cấu trúc công ty, bao gồm các lớp sau: nhân viên, nhân viên kinh doanh và nhân viên kỹ thuật. Các lớp BusinessEmployee() và TechnicalEmployee() sẽ kế thừa từ Employee(). Sau đây là bảng giải thích từng lớp và các phương thức tương ứng của chúng sâu hơn.
Employee
Method header
|
Mô tả
|
public Employee(String name, double baseSalary)
|
Nên tạo một đối tượng nhân viên mới và lấy hai tham số, một cho tên của người dùng và một cho mức lương cơ sở của họ
|
public double getBaseSalary()
|
Nên trả lại lương hiện tại của nhân viên
|
public String getName()
|
Nên trả lại tên hiện tại của nhân viên
|
public int getEmployeeID()
|
Nên trả lại ID của nhân viên. ID nên được cấp thay mặt cho nhân viên tại thời điểm họ được tạo. Employee đầu tiên nên có ID là "1", "2" thứ hai, v.v.
|
public String toString()
|
Nên trả về một chuỗi đại diện của nhân viên là sự kết hợp của id của họ theo sau là tên của họ. Ví dụ: "1 Kasey"
|
public virtual String employeeStatus()
|
Nên trả về một chuỗi đại diện cho trạng thái hiện tại của Employee đó và nói rằng họ đang ở trong hệ thống công ty. Ví dụ: "1 Kasey nằm trong hệ thống của công ty" Hãy nhớ rằng phương thức này sẽ khác nhau đối với mỗi lớp nhân viên phụ.
|
Technical Employee
Method header
|
Sự miêu tả
|
public TechnicalEmployee(String name)
|
Có mức lương cơ bản mặc định là 75000
|
public override String employeeStatus()
|
Nên trả về một Chuỗi mô tả thông tin về TechnicalEmployee bao gồm ID, tên của họ và số lần kiểm tra thành công mà họ đã có. Ví dụ: "1 Kasey có 10 lần đăng ký thành công"
|
Business Employee
Method header
|
Sự miêu tả
|
public BusinessEmployee(String name)
|
Có mức lương mặc định là 50000
|
|
|
public override String employeeStatus()
|
Phải trả về một đại diện Chuỗi của BusinessEmployee này bao gồm ID, tên và số ngân sách được quản lý. Ví dụ: "1 Kasey với ngân sách 22500.0”
|
Visual Studio Step
- Mở Visual Studio
- Chọn File, New, Project
- Trong phần Templates, chọn Visual C#
- Chọn Console App (.NET Framework nếu sử dụng VS 2017 hoặc muộn hơn )
- Đặt tên cho project, ví dụ là Mod2_Lab1
- Chọn vị trí lưu project
- Click OK button và Visual Studio sẽ tạo ra C# Console application project cho bạn và mở file Program.cs trong editor window
- Từ thanh trên cùng chọn Project, Add Class.
- Đặt tên cho class file của bạn là Employee.cs, nhấp vào nút Add và Visual Studio sẽ tạo một định nghĩa lớp trống mới.
- Đầu tiên, chúng ta sẽ thêm các thuộc tính vào Employee(). Điều này bao gồm: tên, mức lương cơ sở và số ID. Đặt con trỏ của bạn ngay sau dấu ngoặc nhọn mở của class Employee() mới tạo của bạn và nhập mã sau đây:
// 3 private member variables: employeeName, employeeBaseSalary, and employeeId
private string employeeName;
private double employeeBaseSalary;
private int employeeId;
// Public properties
public string Name
{
get
{
return employeeName;
}
set
{
employeeName = value;
}
}
public double BaseSalary
{
get
{
return employeeBaseSalary;
}
set
{
employeeBaseSalary = value;
}
}
public int ID
{
get
{
return employeeId;
}
set
{
employeeId = value;
}
}
LƯU Ý: Rất khuyến khích bạn thực sự viết mã và không chỉ đơn giản là copy và paste. Viết mã cho phép bạn đánh giá cú pháp khi bạn nhập nó và giúp củng cố việc học của bạn trên đường con đường học tập.
- Bây giờ chúng ta đã tạo các private member variables và các public properties, hãy tạo một constructor cho Employee(). Theo bảng trên, constructor của chúng tôi nên "tạo một đối tượng nhân viên mới và nhận hai tham số, một cho tên của người dùng và một cho mức lương cơ bản của họ."
- Giữ con trỏ của bạn được đặt bên trong Employee(). Đoạn mã sau bạn sẽ nhập sẽ tạo constructor của bạn:
// Constructor
public Employee(String name, double baseSalary)
{
this.Name = name;
this.BaseSalary = baseSalary;
}
- Tiếp theo, sẽ thêm các "get" methods. Theo bảng trên, có 3 lớp dành cho Employee() của chúng tôi: getBaseSalary(), getName() và getEmployeeID(). Hai cái đầu tiên khá đơn giản, vì vậy hãy bắt đầu với chúng.
- Các phương thức này chỉ đơn giản là trả về biến mà chúng có nghĩa là "có được". Đảm bảo rằng con trỏ của bạn vẫn được đặt bên trong Employee() và nhập mã sau đây:
// This method returns the employee's base salary
public double getBaseSalary()
{
return this.BaseSalary;
}
// This method returns the employee's name
public String getName()
{
return this.Name;
}
- Bây giờ, chúng ta sẽ tạo phương thức getEmployeeID(). Phương pháp này cần "trả lại ID của nhân viên. ID nên được cấp thay mặt cho nhân viên tại thời điểm họ được tạo. Employee đầu tiên nên có ID là" 1 "," 2 "thứ hai, v.v."
- Tương tự như cách chúng tôi giữ số lượng đối tượng ô tô khởi tạo bằng cách sử dụng các static members trong Lab 2 của Mô-đun 1, chúng tôi sẽ tăng số ID bất cứ khi nào constructor của Employee() được gọi. Sau đó chúng tôi sẽ lưu trữ giá trị đó thành một biến cụ thể cho từng đối tượng.
- Để làm như vậy, hãy bắt đầu bằng cách tạo static members trong class Employee(). Đặt con trỏ của bạn sau các thuộc tính khác mà chúng ta đã xác định trong class Employee() và nhập mã sau đây:
// Creates integer variable called "employeeCount" and assigns value to 1
private static int employeeCount = 1;
- 18.Điều này tạo ra biến "employeeCount" sẽ được tăng lên khi các đối tượng được khởi tạo.
- Tiếp theo, trong constructor mà chúng ta đã tạo trước đó, hãy thêm đoạn mã sau để tăng biến "employeeCount" mới được tạo này và sau đó lưu giá trị đó vào biến ID đối tượng.
this.ID = employeeCount++;
- 20.Cuối cùng, chúng tôi muốn có thể truy cập giá trị ID nhân viên này, vì vậy hãy tạo phương thức getEmployeeID() của chúng tôi.
- Đặt con trỏ của bạn ngay sau dấu ngoặc nhọn đóng của phương thức getName() (vẫn nằm trong class Employee()) và nhập mã sau đây:
// This method returns the employee's ID
public int getEmployeeID()
{
return this.ID;
}
- 22.Tiếp theo, chúng ta sẽ tạo phương thức tiếp theo: toString(). Phương thức này cần trả về "Chuỗi mô tả của nhân viên là sự kết hợp của id của họ theo sau là tên của họ. Ví dụ: 1 Kasey."
// This method returns the employee's ID and Name
public String toString()
{
return this.ID + " " + this.Name;
}
- 23.Cuối cùng, chúng ta sẽ tạo phương thức cuối cùng trong class Employee(): employeeStatus(). Phương pháp này "sẽ trả về một chuỗi đại diện cho trạng thái hiện tại của Employee đó và nói rằng họ đang ở trong hệ thống công ty. Ví dụ: 1 Kasey nằm trong hệ thống của công ty"
- Để làm như vậy, chúng ta cần gọi phương thức khác của chúng tôi toString() và đính kèm một chuỗi vào cuối.
- Nhưng phương thức này cũng nói rằng "phương thức này sẽ khác nhau đối với mỗi lớp nhân viên phụ", nghĩa là phương thức này sẽ bị ghi đè trong các lớp con.
- Để cho phép các lớp con của chúng ta ghi đè phương thức này, chúng ta cần thêm từ khóa "virtual" vào tiêu đề phương thức. Từ khóa virtual sẽ cho phép các lớp con thực hiện (họ "có thể" sử dụng nó) phương thức nhưng không yêu cầu họ làm như vậy.
- Giữ con trỏ của bạn bên trong Employee() và nhập mã sau đây:
// This method returns the employee's ID and Name and confirms that the employee is in the system
public virtual String employeeStatus()
{
return toString() + " is in the company's system";
}
- 28.Bây giờ chúng ta đã kết thúc với Employee(), chúng ta sẽ tạo TechnicalEmployee() sẽ kế thừa từ Employee() của chúng ta.
- Từ thanh trên cùng chọn Project, Add Class.
- Đặt tên cho tệp lớp của bạn là TechnicalEmployee.cs, nhấp vào nút Add và Visual Studio sẽ tạo một định nghĩa lớp trống C# mới.
- Đánh dấu con trỏ của bạn trên văn bản "class TechnicalEmployee" và thay thế nó bằng mã sau:
// TechnicalEmployee Class inheriting from Employee Class
class TechnicalEmployee : Employee
- 32.Như đã đề cập trong nội dung khóa học, giờ đây class TechnicalEmployee() của chúng tôi đã "kế thừa" các thuộc tính và phương thức của Employee()! Điều này hiệu quả hơn nhiều so với viết lại mã.
- Hãy tham khảo lại bảng trên. Nó nói rằng TechnicalEmployee của chúng tôi cần phải có một constructor có tham số tên và đặt mức lương cơ bản là 75000.
- Chúng tôi muốn sử dụng lại constructor mà chúng ta đã tạo trong Employee(), vì vậy hãy gọi constructor đó trong class TechnicalEmployee() mới của chúng tôi. Để làm điều đó, chúng ta cần sử dụng base keyword. Đặt con trỏ của bạn bên trong class TechnicalEmployee() và nhập mã sau đây:
// Calls upon base-class (Employee Class) constructor from within derived class (TechnicalEmployee Class)
// Sets baseSalary to 75000 for all TechnicalEmployee objects
public TechnicalEmployee(String name) : base(name, 75000)
{
}
- 35.Điều này "imports" constructor Employee() của chúng tôi và cho phép chúng tôi sử dụng constructor đó khi chúng tôi khởi tạo một đối tượng TechnicalEmployee mới.
- Cuối cùng, chúng tôi muốn thêm phương thức cuối cùng của chúng tôi cho class TechnicalEmployee(): employeeStatus(). Phương thức này "sẽ trả về một đại diện Chuỗi của TechnicalEmployee này bao gồm ID, tên của họ và số lần kiểm tra thành công mà họ đã có. Ví dụ: 1 Kasey có 10 lần đăng ký thành công."
- Trước tiên, chúng ta cần tạo biến thành công CheckIns để theo dõi từng lần kiểm tra của nhân viên. Với mục đích của Lab này, chúng ta hãy đặt số lần đăng ký thành công cho mỗi nhân viên mới được khởi tạo thành 5. Nhập mã sau vào bên trong class TechnicalEmployee():
// Creates integer variable called "successfulCheckIns" and assigns value to 5
public int successfulCheckIns = 5;
- 38.Thứ hai, chúng ta cần tạo phương thức thực tế. Hiện tại, class TechnicalEmployee() đã kế thừa phiên bản Employee() của phương thức employeeStatus(). Chúng ta cần sử dụng từ khóa "override" trong tiêu đề phương thức để ghi đè phiên bản kế thừa và tạo phương thức cụ thể của lớp con. Nhập mã sau vào bên trong class TechnicalEmployee():
// This method returns the toString() method - which is the employee's ID number and name - and prints the number of successful check ins the employee has had
public override String employeeStatus()
{
return this.toString() + " has " + this.successfulCheckIns + " successful check ins";
}
- 39.Phương thức này yêu cầu phương thức toString() được kế thừa mà chúng ta đã tạo trong Employee() và in giá trị đó bên cạnh số lần kiểm tra thành công mà nhân viên đã có.
- Bây giờ chúng ta đã kết thúc với class TechnicalEmployee(), chúng ta sẽ tạo một lớp khác, class BusinessEmployee(), cũng sẽ kế thừa từ class Employee() của chúng ta nhưng theo những cách khác với class TechnicalEmployee() của chúng ta.
- Từ thanh trên cùng chọn Project, Add Class.
- Đặt tên tệp lớp của bạn là BusinessEmployee.cs, nhấp vào nút Add và Visual Studio sẽ tạo định nghĩa lớp trống C# mới.
- Chính xác như chúng ta đã làm với class TechnicalEmployee() của chúng tôi, làm nổi bật con trỏ của bạn trên văn bản "class BusinessEmployee" và thay thế nó bằng mã sau:
// BusinessEmployee Class inheriting from Employee Class
class BusinessEmployee : Employee
- 44.Tiếp theo, chúng ta cần tạo constructor cho class BusinessEmployee() đặt mức lương cơ bản thành 50000. Để làm như vậy, hãy sử dụng lại base keyword và nhập mã sau:
// Calls upon base-class (Employee Class) constructor from within derived class (BusinessEmployee Class)
// Sets baseSalary to 50000 for all BusinessEmployee objects
public BusinessEmployee(String name) : base(name, 50000)
{
}
- 45.Cuối cùng, chúng ta sẽ tạo phiên bản Class của BusinessEmployee() của phương thức employeeStatus(). Theo bảng, phương thức "sẽ trả về một đại diện Chuỗi của BusinessEmployee này bao gồm ID, tên và kích thước của ngân sách hiện được quản lý của họ. Ví dụ: 1 Kasey với ngân sách là 22500.0".
- Hãy tạo một double variable để theo dõi ngân sách tiền thưởng của mỗi nhân viên. Với mục đích của Lab này, chúng tôi sẽ đặt ngân sách tiền thưởng cho mỗi nhân viên mới được khởi tạo thành 1000. Nhập mã sau vào bên trong class BusinessEmployee():
// Creates double variable called "bonusBudget" and assigns value to 1000
public double bonusBudget = 1000;
- 47.Bây giờ chúng tôi đã sẵn sàng để viết mã cho phương thức! Chúng tôi sẽ sử dụng lại từ khóa "override" để tạo phiên bản lớp con duy nhất của phương thức này. Giữ con trỏ của bạn bên trong class BusinessEmployee() và nhập như sau:
// This method returns the toString() method - which is the employee's ID number and name - and prints the bonus budget
public override String employeeStatus()
{
return toString() + " with a budget of " + this.bonusBudget;
}
- 48.Chúng tôi đã hoàn thành việc tạo các lớp Employee, Technical Employee và Business Employee!
- Bây giờ chúng ta hãy tạo ra các đối tượng nhân viên và kiểm tra xem chúng ta đã kế thừa các lớp của mình chưa.
- Chuyển các tab sang tệp Program.cs và đặt con trỏ của bạn bên trong phương thức Main().
- Nhập mã sau đây để tạo 1 đối tượng Employee, 1 đối tượng TechnicalEmployee và 1 đối tượng BusinessEmployee. Chúng tôi cũng muốn truy cập một số phương thức mà chúng tôi đã tạo, vì vậy hãy gọi phương thức employeeStatus() trên mỗi đối tượng:
// Instantiates Employee Object with name Libby and salary 2000 called employee1
var employee1 = new Employee("Libby", 2000);
// Instantiates TechnicalEmployee Object with name Zaynah called employee2
var employee2 = new TechnicalEmployee("Zaynah");
// Instantiates BusinessEmployee Object with name Winter called employee3
var employee3 = new BusinessEmployee("Winter");
// Output to the console window
Console.WriteLine(employee1.employeeStatus() + "..." + employee2.employeeStatus() + "..." + employee3.employeeStatus());
- 52.Nhấn CTRL + F5 hoặc chọn Debug, Start Without Debugging để kiểm tra đầu ra. Bạn sẽ thấy thông báo sau: "1 Libby nằm trong hệ thống của công ty ... 2 Zaynah có 5 lần kiểm tra thành công ... 3 Mùa đông với ngân sách 1000".
Mã hoàn chỉnh của bạn sẽ trông như sau:
Trong tệp Program.cs của bạn:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Mod2_Lab1
{
class Program
{
static void Main(string[] args)
{
// Instantiates Employee Object with name Libby and salary 2000 called employee1
var employee1 = new Employee("Libby", 2000);
// Instantiates TechnicalEmployee Object with name Zaynah called employee2
var employee2 = new TechnicalEmployee("Zaynah");
// Instantiates BusinessEmployee Object with name Winter called employee3
var employee3 = new BusinessEmployee("Winter");
// Output to the console window
Console.WriteLine(employee1.employeeStatus() + "..." + employee2.employeeStatus() + "..." + employee3.employeeStatus());
}
}
}
Trong tệp Employee.cs của bạn:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Mod2_Lab1
{
public class Employee
{
// Creates integer variable called "employeeCount" and assigns value to 1
private static int employeeCount = 1;
// 3 private member variables: employeeName, employeeBaseSalary, and employeeId
private string employeeName;
private double employeeBaseSalary;
private int employeeId;
// Public properties
public string Name
{
get
{
return employeeName;
}
set
{
employeeName = value;
}
}
public double BaseSalary
{
get
{
return employeeBaseSalary;
}
set
{
employeeBaseSalary = value;
}
}
public int ID
{
get
{
return employeeId;
}
set
{
employeeId = value;
}
}
// Constructor
public Employee(String name, double baseSalary)
{
this.Name = name;
this.BaseSalary = baseSalary;
this.ID = employeeCount++;
}
// This method returns the employee's base salary
public double getBaseSalary()
{
return this.BaseSalary;
}
// This method returns the employee's name
public String getName()
{
return this.Name;
}
// This method returns the employee's ID
public int getEmployeeID()
{
return this.ID;
}
// This method returns the employee's ID and Name
public String toString()
{
return this.ID + " " + this.Name;
}
// This method returns the employee's ID and Name and confirms that the employee is in the system
public virtual String employeeStatus()
{
return toString() + " is in the company's system";
}
}
}
Trong tệp TechnicalEmployee.cs của bạn:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Mod2_Lab1
{
// TechnicalEmployee Class inheriting from Employee Class
class TechnicalEmployee : Employee
{
// Creates integer variable called "successfulCheckIns" and assigns value to 5
public int successfulCheckIns = 5;
// Calls upon base-class (Employee Class) constructor from within derived class (TechnicalEmployee Class)
// Sets baseSalary to 75000 for all TechnicalEmployee objects
public TechnicalEmployee(String name) : base(name, 75000)
{
}
// This method returns the toString() method - which is the employee's ID number and name - and prints the number of successful check ins the employee has had
public override String employeeStatus()
{
return this.toString() + " has " + this.successfulCheckIns + " successful check ins";
}
}
}
Trong tệp BusinessEmployee.cs của bạn:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Mod2_Lab1
{
// BusinessEmployee Class inheriting from Employee Class
class BusinessEmployee : Employee
{
// Creates double variable called "bonusBudget" and assigns value to 1000
public double bonusBudget = 1000;
// Calls upon base-class (Employee Class) constructor from within derived class (BusinessEmployee Class)
// Sets baseSalary to 50000 for all BusinessEmployee objects
public BusinessEmployee(String name) : base(name, 50000)
{
}
// This method returns the toString() method - which is the employee's ID number and name - and prints the bonus budget
public override String employeeStatus()
{
return toString() + " with a budget of " + this.bonusBudget;
}
}
}
إرسال تعليق