2011-01-29 23 views
8

Có thể tạo ra một lớp cơ sở như sau:Có thể tạo danh sách tham số của phương thức trừu tượng có chiều dài và loại có thể ghi đè không?

public abstract class baseClass 
{ 
    public abstract void SetParameters(/*want this to be adjustable*/); 
} 

để các lớp học mà ghi đè lên nó có thể xác định các thông số cần thiết? Nói cách khác, tôi muốn để buộc các phương pháp để được ghi đè, nhưng để lại nó lên đến lớp trọng gì được yêu cầu ở đây - vì vậy người ta có thể được

public class derivedClass1 : baseClass 
{ 
    public override void SetParameters(Point a, int b); 
} 

trong khi khác có thể là

public class derivedClass2 : baseClass 
{ 
    public override void SetParameters(List<Line> a, Point b, Point c, bool e); 
} 

?

Nhờ sự giúp đỡ bạn có thể cho

+0

Bạn có nghĩa là để nói 'public class derivedClass: baseClass' trong hai ví dụ cuối cùng? –

+0

Xin lỗi, vâng. Tôi sẽ thay đổi đó – simonalexander2005

Trả lời

10

Tuyệt đối không - rằng sẽ phá vỡ một nửa điểm của việc có phương pháp trừu tượng ở nơi đầu tiên - không ai sẽ có thể gọi nó, bởi vì họ sẽ không biết chữ ký phương thức nào đã thực sự được viết. Toàn bộ điểm của lớp trừu tượng là một khách hàng có thể có tham chiếu kiểu BaseClass mà không quan tâm đến loại triển khai thực tế là gì.

Nếu lớp cơ sở có thể dự đoán trước loại nào có thể tham gia, một khả năng giúp cuộc gọi dễ dàng hơn để có chữ ký chung nhất (thường là chữ có nhiều tham số nhất) và quá tải mà gọi là thiết bị chung cung cấp mặc định cho các thông số mà khách hàng chưa chỉ định.

0

Không, điều này là không thể. Một phương thức ghi đè cần phải khớp chính xác với các tham số — nó giống như việc thực hiện một giao diện. Bạn có thể quan tâm đến mẫu double-dispatch.

+0

Liên kết bạn đã cho dường như làm điều đó cho một tham số kiểu biến (trong trường hợp này bạn cũng có thể sử dụng ?) - nhưng không phải cho một số biến các tham số kiểu biến ... hoặc tôi đang đọc sai nó? – simonalexander2005

+0

Bạn sẽ phải thay đổi ví dụ để chứa danh sách tham số 'params object [] args'. –

0

Có thể thực hiện NẾU tất cả các thông số được đặt cùng loại và trong cùng một số tôi đoán (không chắc chắn bạn có thể sử dụng tham số T [], nhưng nếu có thể thì bạn cũng có thể điều chỉnh). Bạn có thể đạt được bằng cách sử dụng Generics, như @ simonalexander2005 cho biết

public abstract class baseClass<T> where T : class 
{ 
    public abstract T SetParameters(params T[] parameters); 
} 

tùy thuộc vào bạn để quyết định số lượng tham số mà lớp dẫn xuất sẽ sử dụng. Nhưng, im không chắc chắn nếu nó là một thực hành tốt ...

Các vấn đề liên quan