Chỉ đơn giản là Ẩn cài đặt thực tế từ khách hàng sử dụng nó.
- Nó Cung cấp thực hiện concerete cho các chức năng nhất định và điều này không thể trực tiếp instantiated
- này sẽ chỉ được truy cập từ các lớp những người đang thực hiện điều đó.
- Vì vậy, các khách hàng tiêu thụ lớp dẫn xuất, sẽ không bao giờ biết việc triển khai chức năng này vì nó đã được khai thác.
Bây giờ bạn sẽ hỏi tại sao chúng ta cần điều này, vì các giao diện phục vụ cùng một cơ chế.Đi qua các ví dụ logger đơn giản
interface ILogger
{
string PrepareLog(System.Exception ex);
void InitializeLogger(string Type);
int WriteLog(string msg);
}
Bất kỳ khách hàng khai thác gỗ thực hiện giao diện này nên thực hiện tất cả điều này chức năng
class EventLogger : ILogger
{
public override void InitializeLogger(string Type)
{
//Event Logger Initialize
}
public override int WriteLog(string msg)
{
//Write to event log
return 1;
}
public override string PrepareLog(System.Exception ex)
{
return ex.StackTrace ;
}
}
class FileLogger : ILogger
{
public override void InitializeLogger(string Type)
{
}
public override int WriteLog(string msg)
{
//Write to File
return 1;
}
public override string PrepareLog(System.Exception ex)
{
return ex.StackTrace ;
}
}
class MailLogger : ILogger
{
public override void InitializeLogger(string Type)
{
}
public override int WriteLog(string msg)
{
//Write to mail
return 1;
}
public override string PrepareLog(System.Exception ex)
{
//prepare HTML Formatted msg
return ex.StackTrace ;
}
}
Và các lớp EventLogger, FileLogger và maillogger thực hiện các iLogger và cung cấp cho các Bối cảnh cụ thể thực hiện . Bây giờ chúng tôi muốn ẩn thực hiện thực tế của PrepareLog và điều này sẽ làm các hoạt động phổ biến của chuẩn bị thông điệp tường trình từ đối tượng ngoại lệ.
Trong triển khai hiện tại của chúng tôi, chúng tôi không có tùy chọn để làm cho bê tông phương pháp đơn lẻ và các phương thức khác chỉ là hợp đồng.
để cho phép thay đổi chút thực hiện với lớp trừu tượng
abstract class AbstractLogger:ILogger
{
#region ILogger Members
public virtual string PrepareLog(System.Exception ex)
{
return ex.StackTrace;
}
public abstract void InitializeLogger(string Type);
public abstract int WriteLog(string msg);
#endregion
}
class EventLogger : AbstractLogger
{
public override void InitializeLogger(string Type)
{
//Event Logger Initialize
}
public override int WriteLog(string msg)
{
//Write to event log
return 1;
}
}
class FileLogger : AbstractLogger
{
public override void InitializeLogger(string Type)
{
}
public override int WriteLog(string msg)
{
//Write to File
return 1;
}
}
class DBLogger : AbstractLogger
{
public override void InitializeLogger(string Type)
{
}
public override int WriteLog(string msg)
{
//Write to DB
return 1;
}
}
class MailLogger : AbstractLogger
{
public override void InitializeLogger(string Type)
{
}
public override int WriteLog(string msg)
{
//Write to mail
return 1;
}
public override string PrepareLog(System.Exception ex)
{
//prepare HTML Formatted msg
return ex.StackTrace ;
}
}
Bây giờ tôi đã tạo ra lớp AbstractLogger mà thừa hưởng từ iLogger và thực hiện các phương pháp PrepareLog một mình, phương pháp remainig trái trừu tượng. vì vậy người tiêu dùng sẽ viết mã theo ngữ cảnh cụ thể trong quá trình thực hiện của họ.
Vì vậy, bây giờ phương pháp PrepareLog hoàn toàn ẩn (có nghĩa là chuẩn bị nhật ký) từ các cosumers đã khởi tạo bất kỳ Logger nào.
thì tại sao PrepareLog là Virtual ed ??
Có các tình huống mà người tiêu dùng có thể muốn ghi đè lên phương thức chuẩn bị, Ex: MailLogger sẽ ghi đè đầu ra định dạng HTML chuẩn bị và chuẩn bị để cung cấp thư.
câu trả lời ngắn, học kế thừa. – pstanton
@pstanton: Đó là những gì tôi đang làm/cố gắng làm !!! :-D –
@pstanton: Tôi không thấy cách nói cho OP hỏi những câu hỏi mà anh ta đã hỏi là một câu trả lời. –