Tutorial Lab 2 - Abstract Class
Trong Lab cuối cùng, chúng tôi liên quan đến nhân viên công ty bằng cách áp dụng thừa kế. Lab này tập trung vào sửa đổi mã mà chúng tôi đã làm việc trước đây để bạn có thể hiểu và thực hành tạo các lớp trừu tượng.
Như đã đề cập trong nội dung khóa học, chúng tôi có Employee(), nhưng với các lớp nhân viên cụ thể hơn mà chúng tôi thêm vào (như BusinessEmployee và TechnicalEmployee), chúng tôi sẽ không thực sự tạo ra các đối tượng Employee chung(). Vì điều này, chúng tôi sẽ chuyển đổi lớp Employee() thành một lớp trừu tượng.
Bước Visual Studio
- Mở Visual Studio
- Mở tệp C# đã tạo trước đó của bạn Mod2_Lab1
- Đầu tiên, chúng ta sẽ biến Employee() của mình thành một lớp trừu tượng. Để làm như vậy, tất cả những gì chúng ta cần làm là thêm từ khóa "abstract" vào tiêu đề lớp. Chỉnh sửa tiêu đề lớp của tệp Employee.cs và nhập như sau:
// Abstract class
abstract class Employee
- Bây giờ chúng tôi đã chuyển đổi lớp Employee() thành một lớp trừu tượng. Tiếp theo, chúng ta phải quyết định phương thức "phải" nào được thực hiện trong các lớp con và phương thức "có thể" nào được thực hiện hoặc ghi đè, trong lớp con.
- Như đã đề cập trong nội dung khóa học, bất kỳ phương thức nào được khai báo trong một lớp trừu tượng sẽ chứa một số triển khai trong lớp trừu tượng, nhưng có thể được ghi đè trong lớp con, bạn trang trí bằng từ khóa virtual.
- Bây giờ chúng ta đã tạo lớp trừu tượng của mình, chúng ta sẽ buộc các lớp con của chúng ta thực hiện phương thức employeeStatus(). Để làm như vậy, chúng ta cần thêm từ khóa trừu tượng vào phương thức trong Employee().
- Hãy chuyển đổi phương thức employeeStatus() của chúng tôi bằng cách xóa mã phương thức trước đó và thay thế nó bằng mã sau:
// Abstract method
public abstract String employeeStatus();
- Điều này có nghĩa là tất cả các lớp con của class Employeee() của chúng tôi được yêu cầu thực hiện phương thức employeeStatus().
- Hãy chạy mã của chúng tôi! Nhấn CTRL + F5 hoặc chọn Debug, Start Without Debugging để kiểm tra đầu ra. Bạn sẽ thấy lỗi sau: Lỗi. CS0144. Không thể tạo một thể hiện của lớp trừu tượng hoặc interface 'Employee'.
- Các lớp trừu tượng không thể được khởi tạo, điều đó có nghĩa là chúng ta không thể khởi tạo một đối tượng Employee mới. Hãy khắc phục điều này bằng cách loại bỏ đối tượng Employee(). Xóa đoạn mã sau khỏi tệp Program.cs:
// Instantiates Employee Object with name Libby and salary 2000 called employee1
var employee1 = new Employee("Libby", 2000);
- Thay vào đó, hãy làm một nhân viên kỹ thuật khác. Nơi bạn vừa xóa mã trước đó, gõ như sau:
// Instantiates TechnicalEmployee Object with name Libby called employee1
var employee1 = new TechnicalEmployee("Libby");
- Bây giờ, 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 có 5 lần đăng ký thành công ... 2 Zaynah có 5 lần đăng ký 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 giố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 TechnicalEmployee Object with name Libby called employee1
var employee1 = new TechnicalEmployee("Libby");
// 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
{
// Abstract class
abstract 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;
}
// Abstract method
public abstract String employeeStatus();
}
}
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;
}
}
}
Self Assessment Lab
Trong một chu kỳ phát triển điển hình, trước tiên bạn sẽ thiết kế hệ thống phân cấp lớp, tạo các lớp cơ sở và sau đó là các lớp con của bạn. Trong môi trường học tập, bạn cần biết cách tạo các lớp trước khi bạn bị ngập trong hệ thống phân cấp thừa kế. Bạn đã học cách tạo các lớp và đã thấy các ví dụ về kế thừa và các lớp trừu tượng trong các Lab nội dung và hướng dẫn cho mô-đun này.
Bây giờ bạn sẽ tự mình áp dụng các nguyên tắc này bằng cách sử dụng cùng các lớp mà bạn đã làm việc trong Lab tự đánh giá cho Mô-đun 1.
Đối với nhiệm vụ này:
- Tạo một lớp cơ sở Person với các thuộc tính chung cho một người. Hãy nhớ sử dụng đóng gói cho các thuộc tính này.
- Áp dụng các nguyên tắc OOP thích hợp, biến Person thành một lớp trừu tượng
- Làm cho các lớp học sinh và giáo viên của bạn kế thừa từ lớp cơ sở Person
- Sửa đổi các lớp Học sinh và Giáo viên của bạn để chúng kế thừa các thuộc tính chung từ Người
- Sửa đổi các lớp Học sinh và Giáo viên của bạn để chúng bao gồm các đặc điểm cụ thể cho loại của chúng. Ví dụ, một đối tượng Giáo viên có thể có phương thức GradeTest() trong đó học sinh có thể có phương thức TakeTest().
- Chạy cùng một mã trong Program.cs từ Lab tự đánh giá của Module One để tạo các thể hiện của các lớp của bạn để bạn có thể thiết lập một khóa học duy nhất là một phần của chương trình và đường dẫn bằng cấp. Hãy chắc chắn bao gồm ít nhất một Giáo viên và một loạt các sinh viên.
- Đảm bảo các câu lệnh Console.WriteLine bạn có trong Lab tự đánh giá của Module One vẫn đưa ra thông tin chính xác.
Đăng nhận xét