Không - điều này sẽ vi phạm Liskov's Substitution Principle. Bạn nên luôn có thể sử dụng một thể hiện của một kiểu con như thể nó là một thể hiện của một siêu kiểu.
Đừng quên rằng người gọi chỉ có thể biết loại của bạn "là" loại cơ sở hoặc giao diện. Hãy xem xét mã này:
object foo = new TypeWithToStringRemoved();
foo.ToString();
Điều đó sẽ phải biên dịch, phải không? Bây giờ bạn mong đợi điều gì sẽ xảy ra vào thời gian thực hiện?
Bây giờ cho ToString
, GetHashCode
, Equals
và GetType
không có cách nào để tránh việc họ ở nơi đầu tiên - nhưng thường nếu có những phương pháp bạn muốn "loại bỏ" từ một loại cơ sở, gợi ý rằng bạn không nên kế thừa từ nó ở nơi đầu tiên. Cá nhân tôi tìm thấy vai trò của thừa kế được phần nào overplayed trong lập trình hướng đối tượng: nơi nó hữu ích là thực sự hữu ích, nhưng nói chung tôi thích thành phần hơn thừa kế, và giao diện như là một hình thức trừu tượng hơn là lớp cơ sở.
Nguồn
2010-05-06 07:16:27
http://www.codinghorror.com/blog/2004/08/inherits-nothing.html – Svisstack
này được gọi là "từ chối Bequest" mã mùi: "một lớp ghi đè một phương thức của một lớp cơ sở theo cách mà hợp đồng của lớp cơ sở không được vinh danh bởi lớp dẫn xuất ". http://en.wikipedia.org/wiki/Code_smell – Mathias
Không có cách nào để xóa phương thức. Nếu phương thức là 'virtual' (được đánh dấu bằng' virtual', 'abstract' hoặc' override'), bạn may mắn vì tác giả của lớp cơ sở cho phép bạn quyết định hành vi của phương thức. Bạn có thể làm cho nó không làm gì, hoặc ném một ngoại lệ (nhưng lưu ý rằng điều này có thể phá vỡ sự mong đợi của lớp cơ sở từ phương thức của bạn, vì vậy nó sẽ giới thiệu các vấn đề trong các trường hợp _some_). Nếu phương pháp này không phải là ảo, bạn không thể làm được gì nhiều. Ẩn nó với một phương pháp khác là một ý tưởng rất xấu (và không loại bỏ nó tất nhiên). –