Có thể? Bạn có thể thay đổi quyền truy cập của bất cứ điều gì thành bất cứ điều gì khác không?C# ghi đè lên thành viên công khai và đặt thành riêng tư
Trả lời
Không, bạn có thể ẩn thành viên công cộng với một phương pháp tư nhân trong một lớp con, nhưng bạn có thể không override thành viên công cộng với một tư nhân trong một lớp con. Và, trên thực tế, nó không chỉ là một điều công cộng/riêng tư, điều này áp dụng cho việc thu hẹp quyền truy cập nói chung.
Revised: Bằng cách ẩn với một truy cập hạn chế hơn - trong trường hợp này truy cập tin - bạn sẽ vẫn thấy các thành viên lớp cơ sở từ một cơ sở đẳng cấp hoặc tham chiếu sub-class, nhưng nó sẽ hoãn đến mới khi có sẵn từ cấp truy cập mới.
Vì vậy, nói chung, khi bạn ẩn, ẩn sẽ được ưu tiên khi hiển thị ở cấp truy cập. Nếu không, phương pháp ban đầu là phương pháp được sử dụng.
public class BaseClass
{
public virtual void A() { }
public virtual void B() { }
}
public class SubClass
{
// COMPILER ERROR, can't override to be more restrictive access
private override void A() { }
// LEGAL, you can HIDE the base class method, but which is chosen
// depends on level accessed from
private new void B() { }
}
Vì vậy, SubClass.B()
CHỈ ẩn các phương thức lớp cơ sở khi có thể truy cập. Tức là, nếu bạn gọi SubClass.B()
bên trong của SubClass
thì nó sẽ có dạng ẩn là B()
, nhưng vì B()
là riêng tư, không hiển thị với các lớp bên ngoài chính nó và do đó chúng STILL thấy BaseClass.B()
.
Các dài và ngắn của nó là:
1) Bạn không có thể ghi đè một phương pháp để có hạn chế hơn (truy cập khôn ngoan). 2) Bạn có thể ẩn một phương thức với một phương thức hạn chế hơn, nhưng nó sẽ chỉ có tác dụng khi loại truy cập mới hiển thị, nếu không thì kiểu cơ sở sẽ hiển thị.
public class BaseClass
{
public virtual void A() { }
public virtual void B() { }
}
public class SubClass : BaseClass
{
public virtual void A() { B(); }
// legal, you can do this and B() is now hidden internally in SubClass,
// but to outside world BaseClass's B() is still the one used.
private new void B() { }
}
// ...
SubClass sc = new SubClass();
BaseClass bc = new BaseClass();
// both of these call BaseClass.B() because we are outside of class and can't
// see the hide SubClass.B().
sc.B();
bc.B();
// this calls SubClass.A(), which WILL call SubClass.B() because the hide
// SubClass.B() is visible within SubClass, and thus the hide hides BaseClass.B()
// for any calls inside of SubClass.
sc.A();
Bạn có chắc chắn về điều đó không? Có vẻ như nó sẽ phá vỡ của Liskov –
Bạn có thể làm điều đó. Tuy nhiên, bạn chỉ có thể truyền nó vào 'BaseClass' và gọi phương thức như thể không có gì xảy ra. – Femaref
@Brian: Đúng, ẩn để hạn chế hơn được cho phép. Biên dịch tốt.Hãy nhớ rằng phương thức vẫn tồn tại, và miễn là bạn coi nó như là một tham chiếu lớp cơ sở, nó vẫn ở đó và chạy, nó không thể nhìn thấy từ một lớp con (trong trường hợp ẩn riêng). Không nói nó luôn là sự lựa chọn tốt nhất, OO khôn ngoan, nhưng nó có thể trong C#. –
Không.
Cách điển hình để giải quyết vấn đề này là ném NotImplementedException
hoặc thứ gì đó vào hiệu ứng đó.
'NotImplementedException' ngụ ý một cái gì đó bị bỏ qua do nhầm lẫn. 'NotSupportedException' ngụ ý một cái gì đó bị bỏ qua bởi thiết kế (và có thể * vẫn * do nhầm lẫn, như trường hợp có thể). –
Bạn không thể thu hẹp hoặc mở rộng khả năng hiển thị của thành viên bị ghi đè. Tuy nhiên, bạn có thể xác định phương thức khác bằng từ khóa new
, có thể cung cấp cho bạn phương thức mới với cùng tên , nhưng không tương thích về mặt đa hình.
public class A : B
{
public new void Foo()
{
base.Foo();
}
}
Đó không phải là quá ** chuyến đi **, đó là quá ** viết **. Nếu bạn bỏ lớp này sang 'B', phương thức sẽ có sẵn, ngay cả khi bạn ghi đè nó trong' A'. – Femaref
@Femaref Về mặt kỹ thuật, loại quyền tốt nhất. –
- 1. Lớp thành viên tĩnh - khai báo lớp riêng tư và lớp thành viên riêng tư?
- 2. Tại sao xác định các thành viên riêng dưới các thành viên công khai trong C++?
- 3. Ghi đè biến thành viên trong C++
- 4. Thành viên riêng tư trong CoffeeScript?
- 5. Ẩn các thành viên dữ liệu riêng tư? (C++)
- 6. Ghi đè các chức năng ảo công cộng với các chức năng riêng tư trong C++
- 7. Nối tiếp dữ liệu thành viên riêng tư
- 8. Tự động thay đổi thành công khai thành riêng tư (Java)
- 9. C++: Làm thế nào một hàm thành viên tĩnh công khai truy cập các biến thành viên cá thể riêng?
- 10. Thành viên riêng tư trong lớp học pimpl?
- 11. Java: Ngăn chặn ghi đè của biến thành viên
- 12. const tham chiếu thành viên công khai cho thành viên lớp học tư nhân - tại sao nó hoạt động?
- 13. Ghi đè thành viên ASP.NET trong ASP.NET MVC 4
- 14. là điều này có thể thừa hưởng lớp riêng tư nhưng làm cho các thành viên được công khai?
- 15. Các Thành viên Riêng tư trong R Lớp Tham chiếu
- 16. Không phải thành viên công cộng cho giao diện C#
- 17. Puzzle - phơi bày một công tiểu thành viên của thành viên riêng với kiểu tùy chỉnh
- 18. Thành viên ghi đè TypeScript không phải là loại phụ của thành viên gốc
- 19. Phân vùng cấu trúc thành các phần riêng tư và công cộng?
- 20. Có thể tạo khối "riêng tư" hoặc "công khai" trong C# như trong C++ không?
- 21. Tại sao Visual Studio's intellisense hiển thị các thành viên và chức năng riêng tư?
- 22. Lỗi C++: Không khai báo thành viên
- 23. C# - Lý do cho "Các thành viên giao diện được triển khai rõ ràng luôn ẩn hoàn toàn riêng tư?"
- 24. Tuyên bố thuộc tính lớp: riêng tư và công khai
- 25. Quan điểm thực tế về riêng tư và công khai
- 26. keytool - xem các khóa công khai và riêng tư
- 27. cách truy cập vào các thành viên riêng tư của lớp lồng nhau?
- 28. Máy chủ lưu trữ SVN công khai hoặc riêng tư?
- 29. Tôi có thể đặt biến thành viên công khai ở chế độ riêng tư trong lớp học có nguồn gốc không?
- 30. Asp.net ghi đè cài đặt thành viên khi chạy (asp.net mvc)
Tôi viết chính tả đó ít nhất một lần mỗi ngày. –
@Phil: Không, OP đã viết đúng IMO. ;) – Yuck
wow Tôi chưa bao giờ để ý đến sau khi nó được sửa lại –