Tôi biết đã có một số câu trả lời cho điều này, và nó khá cũ, nhưng phương pháp đơn giản nhất để làm điều này chỉ là khai báo chúng là new private
.
Hãy xem xét ví dụ mà tôi hiện đang làm việc, nơi tôi có API cung cấp mọi phương thức trong DLL của bên thứ ba. Tôi phải dùng các phương thức của chúng, nhưng tôi muốn sử dụng một thuộc tính .Net, thay vì phương thức "getThisValue" và "setThisValue". Vì vậy, tôi xây dựng một lớp thứ hai, kế thừa đầu tiên, tạo một thuộc tính sử dụng các phương thức get và set, và sau đó ghi đè lên các phương thức get và set ban đầu là riêng tư. Chúng vẫn có sẵn cho bất kỳ ai muốn xây dựng thứ gì đó khác biệt trên chúng, nhưng nếu chúng chỉ muốn sử dụng động cơ tôi đang xây dựng, thì chúng sẽ có thể sử dụng các đặc tính thay vì các phương pháp.
Sử dụng phương pháp lớp kép sẽ loại bỏ mọi hạn chế khi không thể sử dụng tuyên bố new
để ẩn thành viên. Bạn chỉ đơn giản là không thể sử dụng override
nếu các thành viên được đánh dấu là ảo.
public class APIClass
{
private static const string DllName = "external.dll";
[DllImport(DllName)]
public extern unsafe uint external_setSomething(int x, uint y);
[DllImport(DllName)]
public extern unsafe uint external_getSomething(int x, uint* y);
public enum valueEnum
{
On = 0x01000000;
Off = 0x00000000;
OnWithOptions = 0x01010000;
OffWithOptions = 0x00010000;
}
}
public class APIUsageClass : APIClass
{
public int Identifier;
private APIClass m_internalInstance = new APIClass();
public valueEnum Something
{
get
{
unsafe
{
valueEnum y;
fixed (valueEnum* yPtr = &y)
{
m_internalInstance.external_getSomething(Identifier, yPtr);
}
return y;
}
}
set
{
m_internalInstance.external_setSomething(Identifier, value);
}
}
new private uint external_setSomething(int x, float y) { return 0; }
new private unsafe uint external_getSomething(int x, float* y) { return 0; }
}
Giá trị hiện tạiEnum khả dụng cho cả hai lớp, nhưng chỉ có thuộc tính hiển thị trong lớp APIUsageClass. Lớp APIClass vẫn có sẵn cho những người muốn mở rộng API ban đầu hoặc sử dụng nó theo một cách khác, và APIUsageClass có sẵn cho những người muốn một cái gì đó đơn giản hơn.
Cuối cùng, những gì tôi sẽ làm là làm cho nội bộ của APIClass và chỉ hiển thị lớp được kế thừa của tôi.
Nguồn
2010-12-08 20:54:44
Bạn không thể đóng dấu nó, cũng có cùng tác dụng không? –
@JamesM không có obselete với thành viên ngăn chặn đúng _access_, niêm phong ngăn chặn thành viên _inheritance_. Vì vậy, một lớp niêm phong không thể được bắt nguồn từ, và một phương pháp niêm phong cho phép các thành viên lớp khác được ghi đè nhưng ngăn cản thành viên đó bị ghi đè. Sealed không ngăn chặn gọi lớp đó hoặc thành viên, trong khi obselete với đúng ném một lỗi trình biên dịch nếu bạn cố gắng gọi nó. –
@RobertPetz khi sử dụng lỗi thời, nó đưa ra cảnh báo chứ không phải lỗi. Sự khác biệt lớn. –