Tôi không thấy thuộc tính như vậy, nhưng tôi đoán là có thể. This article trên MSDN mô tả phiên bản thông qua việc sử dụng các từ khóa overrides
và new
.
Tóm lại, C# được trang bị các tính năng ngôn ngữ cho phép các lớp dẫn xuất phát triển và vẫn duy trì khả năng tương thích. Ví dụ này cho thấy mối quan hệ hoàn toàn dựa trên cơ sở, nhưng cơ sở thực sự sẽ thực hiện giao diện bạn cần cho phiên bản. Có một giao diện yêu cầu giao diện khác (phiên bản trước) cùng với phương pháp này khá hữu ích.
Ví dụ về việc tạo ra một giao diện mà đòi hỏi khác:
public interface IMyInterface
{
void FirstMethod();
}
public interface IMySecondInterface : IMyInterface
{
void SecondMethod();
}
Ví dụ về sử dụng thừa kế để duy trì khả năng tương thích:
public class MyBase
{
public virtual string Meth1()
{
return "MyBase-Meth1";
}
public virtual string Meth2()
{
return "MyBase-Meth2";
}
public virtual string Meth3()
{
return "MyBase-Meth3";
}
}
class MyDerived : MyBase
{
// Overrides the virtual method Meth1 using the override keyword:
public override string Meth1()
{
return "MyDerived-Meth1";
}
// Explicitly hide the virtual method Meth2 using the new
// keyword:
public new string Meth2()
{
return "MyDerived-Meth2";
}
// Because no keyword is specified in the following declaration
// a warning will be issued to alert the programmer that
// the method hides the inherited member MyBase.Meth3():
public string Meth3()
{
return "MyDerived-Meth3";
}
public static void Main()
{
MyDerived mD = new MyDerived();
MyBase mB = (MyBase) mD;
System.Console.WriteLine(mB.Meth1());
System.Console.WriteLine(mB.Meth2());
System.Console.WriteLine(mB.Meth3());
}
}
Ok, phiếu bầu áp đảo đã là "không, nhưng ...". Tôi sẽ đổ lỗi cho điều này vào một ngày dài và tôi cảm thấy mệt mỏi. :) –
Tôi đã suy nghĩ một chút về cách thức/nếu điều này có thể hoạt động. Trừ khi tôi bị nhầm lẫn, chỉ có trình biên dịch người tiêu dùng mới phải "hỗ trợ" điều này. Trình biên dịch giao diện sẽ đơn giản thêm thuộc tính vào assembly, trong khi trình biên dịch người tiêu dùng sẽ là trình biên dịch để thực thi các triển khai. Nó sẽ gần như (mặc dù không phải về mặt kỹ thuật) là "mã đường" để ngăn chặn ITest1, ITest2, vv –
Người tiêu dùng sẽ phải chỉ định phiên bản nó đang sử dụng, nhưng sau đó bạn có một số khó khăn. Điều gì sẽ xảy ra nếu mã của bạn sử dụng cả hai phiên bản? Vì vậy, bạn có Class1: [InterfaceVersion (1)] ITest và Class2: [InterfaceVersion (2)] ITest. Sau đó, bạn làm "nếu (Class2 là ITest)" ... nhưng cái nào? Nó giống như khi bạn sử dụng thuộc tính ở một nơi, bạn phải sử dụng nó ở mọi nơi. Trình biên dịch sẽ phải theo dõi tất cả điều này và buộc nó vào bạn. Nó có thể sẽ dễ dàng hơn khi thực hiện ITest1, ITest2 ... Vì vậy, thuộc tính "tiện lợi" mới này có thể thực sự làm cho nó tồi tệ hơn. :) –