2009-06-09 32 views
5

Nếu tôi có một lớp trừu tượng và các lớp dẫn xuất của lớp đó, tôi đúng là, theo thực hành thiết kế tốt và thiết thực, các lớp dẫn xuất không nên cung cấp các phương thức công khai bổ sung (chúng chỉ nên triển khai các lớp trừu tượng và tùy chọn ghi đè các phương thức cha mẹ)?Phương pháp công cộng bổ sung trong các lớp học có nguồn gốc?

Hơn nữa, thực tế có chấp nhận được là có chữ ký phương thức hàm tạo khác nhau cho mỗi lớp dẫn xuất không?

+0

* CHỈNH SỬA * FYI, tôi đang đề cập đến trường hợp bạn đang xây dựng một đối tượng từ một nhà máy. Tôi đang tranh luận rằng mã gọi điện, trong trường hợp của một nhà máy, nên biết những phương thức mong đợi từ các lớp dẫn xuất. –

Trả lời

5

Cá nhân tôi cũng không gặp vấn đề gì.

Đối với các phương thức công khai bổ sung đối với các lớp dẫn xuất:

Tính hữu dụng hạn chế trong điều này, trong nhiều trường hợp. Các phương thức bổ sung sẽ không thể sử dụng được khi lớp đã được tạo hoặc được đặt thành tham chiếu đến lớp cơ sở, làm hạn chế tính hữu dụng của thực hành này. Điều đó đang được nói, không có gì đặc biệt sai với cách tiếp cận này. Các lớp con có nghĩa là thêm hành vi cụ thể - đôi khi, trong một hệ thống phân cấp lớp, có một hành vi mới trong một lớp con không thích hợp với lớp cơ sở. Nếu lớp con sẽ được sử dụng thường xuyên trên riêng của nó, nó có vẻ hoàn toàn hợp lý cho các hành vi thêm được mô hình hóa trong các phương pháp.

Đối với chữ ký hàm tạo -

Tôi cũng không thấy vấn đề gì với điều này. Các lớp con thường cần thêm thông tin để được đưa vào trạng thái khả dụng hơn lớp trừu tượng. Điều đó đang được nói, tôi thường đảm bảo thực hiện mọi hàm tạo trong lớp cơ sở, cộng thêm các tham số mới cần thiết cho lớp con.

đó đang được nói:

Trừ khi có lý do chính đáng, tôi muốn tránh có một constructor lớp con với các thông số ít hơn các lớp cơ sở ... tại sao tôi sẽ có thể xác định một cái gì đó trên một trường hợp chung chung hơn và không phải là trường hợp cụ thể? Tôi thấy rằng nó thường gây nhầm lẫn khi các lớp con có các tùy chọn xây dựng hoàn toàn khác với các lớp cơ sở của chúng.

+0

nếu bạn đang xây dựng một đối tượng từ một nhà máy, thì tôi có đúng là không nên có các phương pháp công cộng bổ sung? Không nên gọi mã, trong trường hợp của một nhà máy, biết những gì các phương pháp để mong đợi để có? –

+0

Phụ thuộc - ngay cả khi bạn đang xây dựng từ một nhà máy, nhà máy sẽ cần phải biết loại biên dịch của đối tượng (để gọi hàm tạo thích hợp). Nó có thể "biết" về các thông số bổ sung. Trong trường hợp này, mặc dù, nó thực sự chỉ phụ thuộc vào kịch bản, làm thế nào nó sẽ được sử dụng, vv –

1

Bạn hoàn toàn có thể chấp nhận thêm các phương thức công khai bổ sung vào các lớp học có nguồn gốc của mình. Nó cũng hoàn toàn chấp nhận được để cung cấp cho họ các chất co giãn khác nhau. (Trong thực tế, đây là khá phổ biến.)

0

các lớp học có nguồn gốc không nên cung cấp phương pháp nào phụ

một con chó có thể làm những điều mà một con vật có thể không?

Hơn nữa, thực tiễn có thể chấp nhận có chữ ký phương thức khởi tạo khác nhau cho mỗi lớp dẫn xuất không?

Không có vấn đề gì ở đây. Các loại có nguồn gốc không bắt buộc phải khớp với chữ ký của nhà xây dựng của anh chị em hoặc cha mẹ của chúng.

+0

Để trả lời câu hỏi yr, Có một con chó CÓ THỂ làm những việc mà một số loài vật không thể làm ... Giống như Bark, Bite, Run, Shed, Jump, vv ... Worms là Động vật, (chúng không phải là thực vật) - và một con sâu không thể làm bất kỳ điều gì trong số đó ... –

2

Đây là vẻ đẹp của các lớp học có nguồn gốc.

Trong khi lớp Bút có thể có hàm write(), một lớp RetractablePen mở rộng Pen cũng có thể có hàm retractPoint().

Khi bạn mở rộng một lớp, điều đó có nghĩa là - theo nghĩa đen - mở rộng chức năng của nó.

+0

Nếu bạn đang xây dựng một đối tượng từ một nhà máy, nói, sau đó tôi phải rằng không nên có thêm phương pháp công cộng ? Không nên gọi mã, trong trường hợp của một nhà máy, biết những gì các phương pháp để mong đợi để có? –

+0

Nếu bạn đang xây dựng nó từ một nhà máy, sau đó bạn có thể sử dụng đa hình và nhìn vào lớp như thể nó chỉ là cha mẹ của nó. Trong trường hợp đó, bạn sẽ không có quyền truy cập vào các phương thức được định nghĩa trong lớp con, trừ khi bạn đã kiểm tra instanceof và bỏ nó. –

1

Không, hoàn toàn hợp lý (và đôi khi rất cần thiết theo thiết kế) để thêm các phương thức công khai bổ sung. Hãy xem xét tình huống (hoàn toàn giả tạo) của lớp cơ sở trừu tượng Shape có thành viên Location và phương thức Size. Ví dụ: khi bạn lấy được Polygon từ Shape, bạn có thể muốn thêm phương thức công khai được gọi là GetNumberOfSides(); nhưng bạn không muốn có điều đó khi bạn lấy được Circle từ Shape.

Trong cùng một cách, các loại dẫn xuất có thể có các yêu cầu xây dựng rất khác nhau; nó không thực sự có thể biết tất cả các yêu cầu có thể là gì khi xác định lớp cơ sở trừu tượng, do đó, cảm thấy tự do để có chữ ký khác nhau. Chỉ vì các kiểu được dervied của bạn sẽ đa hình cho lớp cơ sở trừu tượng không có nghĩa là lớp cơ sở đó áp đặt các giới hạn nghiêm ngặt về cách bạn có thể triển khai các phép trừu tượng được định nghĩa trong lớp cơ sở đó; bạn hoàn toàn tự do làm điều đó dù bạn muốn.

2

Nói chung là tốt.

Điều bạn muốn tránh là sử dụng cụ thể trong phần chung. tức là

foreach(Animal a in myFarm.Animals) 
{ 
    a.Feed(); 
    // this is a bit grim 
    if(a is Horse) 
    { 
     ((Horse)a).CleanStable(); 
    } 
} 

Vì vậy, đó không phải là hành động thêm phương pháp công khai mà đúng hơn là bạn gọi chúng.

+0

Tôi muốn một con ngựa làm sạch ổn định của riêng mình! Tôi có thể lấy một cái ở đâu? ;) –

+0

Vâng ... Tôi biết ... tôi đang viết trong thời gian xây dựng nên tôi không có thời gian để trở thành người đọc như tôi thường ...: (... nó sẽ làm. – Quibblesome

0

Nó không chỉ chấp nhận được, nó thường là cần thiết cho các nhà thầu khác nhau. Ví dụ, nếu chúng ta có một (không thay đổi) lớp Rectangle và mở rộng nó với một (không thay đổi) Square, các nhà xây dựng Quảng trường nên (để sử dụng Java cho thời điểm này)

public Square(double size) 

trong khi các nhà xây dựng của Rectangle sẽ

public Rectangle(double width, double height) 

Điều gì cần xảy ra là trình tạo lớp con phải gọi một số hàm tạo lớp con thích hợp.

Đối với các phương thức công khai bổ sung, nó có thể phụ thuộc vào việc sử dụng. Đối với trường hợp Square, tôi sẽ không thêm bất kỳ phương thức bổ sung nào. Tuy nhiên, trong Java, có một lớp con PrintWriter của Writer với mục đích là thêm một số phương thức tiện lợi. Trong trường hợp này tôi nghĩ rằng nó ổn (Java chắc chắn có một số ví dụ xấu nhưng tôi không nghĩ rằng đây là một trong số họ). Tôi cũng sẽ mong đợi khả năng của một số phương pháp bổ sung cho các loại container/subpart.

Điều bạn không nên làm là thay đổi phương thức siêu lớp theo cách vi phạm kỳ vọng của lớp học siêu hạng.

1

Nếu bạn tôn trọng Liskov substitution principle, bạn có thể làm những gì bạn muốn.

Tất nhiên, thêm phương thức vào lớp dẫn xuất không vi phạm nguyên tắc.

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