2009-03-11 25 views
5

Tôi có điều này trong lớp cơ sở của tôi:Làm thế nào để ghi đè lên một phương pháp Base Class và thêm một tham số

protected abstract XmlDocument CreateRequestXML(); 

tôi cố gắng ghi đè này trong lớp có nguồn gốc của tôi:

protected override XmlDocument CreateRequestXML(int somevalue) 
{ 
    ...rest of code 
} 

Tôi biết đây là một câu hỏi dễ dàng nhưng vì tôi đã giới thiệu một param là vấn đề? Vấn đề là, một số các lớp dẫn xuất có thể hoặc có thể không có các tham số trong việc thực hiện nó.

Trả lời

11

Khi bạn ghi đè phương thức, ngoại trừ từ ghi đè thay cho ảo hoặc trừu tượng, nó phải có chữ ký giống hệt như phương thức gốc.

Điều bạn đã làm ở đây là tạo phương thức mới không liên quan. Không thể giới thiệu một tham số và vẫn ghi đè.

+0

Ok, vì vậy hãy nói rằng bạn muốn đảm bảo mọi lớp thừa kế lớp cơ sở này được yêu cầu để triển khai phương thức đó. Nhưng bạn biết rằng trong một số đó sẽ có một số tham số cần thiết đến phương thức đó và một số không. Rồi sao? Bạn không yêu cầu params và nhận được chúng thông qua một lĩnh vực priv? – user72603

+0

Vì vậy, bạn muốn các lớp con thực hiện phương thức được bảo vệ và trong một số lớp con bạn muốn yêu cầu thông số đôi khi vì chúng dựa vào chúng và trong các trường hợp khác, nó có thể không. Nếu phương pháp này không có nghĩa là để được tiêu thụ công khai, bạn có thể nhận được từ các thành viên tư nhân của lớp ... là điển hình? – user72603

+1

Tôi chỉ đang cố gắng tìm ra (thực hành tốt nhất) khi tốt nhất để rời khỏi một phương pháp được bảo vệ hoặc riêng tư không có tham số và chỉ nhận được những gì cần từ các trường riêng tư thay thế – user72603

0

Có tham số là vấn đề, chữ ký phương thức phải khớp chính xác (bao gồm giá trị trả về và tham số).

2

Nếu một số lớp dẫn xuất cần tham số và một số không, bạn cần phải có hai phiên bản quá tải của phương thức. Sau đó, mỗi lớp dẫn xuất có thể ghi đè lên lớp mà nó cần.

class Foo {  
    protected abstract XmlDocument CreateRequestXML(int somevalue); 
    protected abstract XmlDocument CreateRequestXML(); 
}; 

class Bar : public Foo {  
    protected override XmlDocument CreateRequestXML(int somevalue) { ... }; 
    protected override XmlDocument CreateRequestXML() 
     { CreateRequestXML(defaultInt); } 
}; 

Điều này tất nhiên giới thiệu sự cố của người dùng đang gọi sai. Nếu không có mặc định chấp nhận được cho paramter thêm, bạn có thể phải ném một ngoại lệ trong lớp dẫn xuất nếu phiên bản sai được gọi.

0

Tôi rất tò mò về những gì bạn đang cố gắng thực hiện với mã này.

Thông thường bạn xác định hàm trừu tượng khi lớp sử dụng biết chữ ký của nó. Lớp sử dụng có một "hợp đồng" với lớp cơ sở của bạn.

Khi bạn muốn lấy được từ baseclass và thêm các tham số bổ sung, lớp sử dụng biết phải gọi gì trên lớp cơ sở?

Dường như lỗ hổng kiến ​​trúc .... nhưng có thể bạn có thể thêm một số thông tin bổ sung vào chủ đề nội tâm.

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