Hãy tưởng tượng các thông số này là từ một dll bên ngoài. Một lớp học mà thực hiện một giao diện một cách rõ ràng:Mục đích nhằm che giấu việc triển khai giao diện rõ ràng của lớp cơ sở mà không cần cảnh báo?
public interface IDebug
{
string GetImportantInfo();
}
public class ExternalClass : IDebug
{
public void DoSomethingImportant()
{
System.Diagnostics.Debug.WriteLine("Something important was done...");
}
string IDebug.GetImportantInfo() //Explicit implementation
{
DoSomethingImportant();
return nameof(ExternalClass);
}
}
Rồi một này là từ mã nội bộ, nơi bạn biết bạn cần phải thực hiện các giao diện:
public class Debug : ExternalClass, IDebug
{
public string GetImportantInfo()
{
return nameof(Debug);
}
}
Bây giờ khi tôi đang gọi Debug
's GetImportantInfo()
phương pháp từ các lớp con, việc thực hiện rõ ràng trong lớp cha không được gọi:
static void Main(string[] args)
{
IDebug test = new Debug();
var impInfo = test.GetImportantInfo();
System.Diagnostics.Debug.WriteLine(impInfo); //"Debug"
}
Và gợi ý nhẹ duy nhất tôi dường như nhận được là Tôi không nhận được một lỗi biên dịch khi thêm giao diện IDebug
đến lớp Debug
, mà không thực hiện phương pháp này:
public class Debug : ExternalClass, IDebug
{
}
Tại sao không có cảnh báo biên dịch khi bạn ghi đè lên thực hiện của một lớp cha như thế này? Nếu lớp cơ sở thực hiện nó ngầm, tôi nhận được một cảnh báo biên dịch yêu cầu tôi sử dụng từ khóa new
. Nhưng sử dụng từ khóa new
để ghi đè phương thức được triển khai rõ ràng sẽ đưa ra cảnh báo biên dịch:
Thành viên 'Program.Debug.GetImportantInfo()' không ẩn thành viên được kế thừa. Từ khóa mới không bắt buộc.
Có mục đích dự định cho điều này hay đây là lỗi không? Nếu nó được dự định, lý do chính thức là gì?
Vâng, bạn không nên kế thừa từ bất kỳ lớp nào mà không hoàn toàn hiểu nó ngay từ đầu. Việc biết những giao diện mà lớp cơ sở thực hiện (trực tiếp hay không) có vẻ như là một điều hợp lý để mong đợi. Xem xét điều này và biết làm thế nào C# * giao diện tái thực hiện * hoạt động nên là đủ để tránh cảnh báo – InBetween
Ngoài ra, cảnh báo bạn nhận được khi giao diện được thực hiện ngầm trong lớp cơ sở có ít để làm với giao diện thực hiện ở tất cả; phương pháp cũ đơn giản của nó là ẩn náu. – InBetween
Bạn hoàn toàn miễn phí để có ý kiến đó. Nhưng về cơ bản, tôi đánh giá lời khuyên của bạn là "đừng phạm sai lầm". Giả định rằng _everyone_ là không thể sai lầm, là một kỳ vọng không thể đối với tôi. Việc vội vàng hoặc bị quên là hai trường hợp sử dụng bình thường, điều này có thể xảy ra. Và đột nhiên bạn có thể dành một thời gian dài cố gắng để gỡ lỗi các hành vi bất ngờ. Tôi không thấy một sự khác biệt giữa sự cần thiết của "phương pháp cũ tốt ẩn" và điều này. –