2012-03-26 14 views
5

Tôi đang tạo trình ghi nhật ký cho một ứng dụng. Tôi đang sử dụng thư viện logger của bên thứ ba. Trong đó logger được thực hiện như singleton.Việc mở rộng một lớp đơn có sai không?

Tôi đã mở rộng lớp trình ghi nhật ký đó vì tôi muốn thêm một số hàm tĩnh khác. Trong các hàm tĩnh này, tôi sử dụng nội bộ cá thể (là duy nhất) của Logger (mà tôi kế thừa).

Tôi không tạo ra cá thể MyLogger hoặc cũng không triển khai lại phương thức getInstance() của lớp siêu hạng. Nhưng tôi vẫn nhận được cảnh báo như destructor của MyLogger không thể được tạo ra như cha mẹ class (Loggger) destructor là không thể truy cập.

Tôi muốn biết, Tôi đang làm điều gì đó sai? Thừa kế singleton là sai hoặc nên tránh?

Trả lời

4

Rời bỏ giá trị của mẫu singleton sang một bên (có một trường phái tư tưởng mô tả nó như là một mô hình chống) nó không phải là cần thiết để lớp con nó chỉ đơn giản là thêm tĩnh chức năng. Dưới đây là cách tiếp cận ngôn ngữ cụ thể mà tôi muốn để subclassing một singleton:

  • Sử dụng một hàm tự do đứng kèm theo trong một C++ namespace
  • Sử dụng một lớp mở rộng trong C#
  • Sử dụng một lớp helper trong Java
  • Sử dụng một loại trong Objective-C
+0

Tôi đang sử dụng ngôn ngữ c + + tôi đang nghĩ đến việc tạo ra một lớp bao bọc của các phương thức tĩnh duy nhất mà sẽ không kế thừa từ lớp singleton Logger. Nó thế nào?? Và bạn sẽ vui lòng xây dựng trên phương pháp bạn đã mô tả ở trên cho C++. Cảm ơn .. – EngineeredBrain

+0

@AnwarShaikh Điều đó cũng hoạt động - đây là những gì tôi sẽ làm trong Java, bởi vì các chức năng tự do không có sẵn ở đó.Tôi muốn đi tuyến đường đó trong C++ là tốt, nhưng chỉ khi tôi cần chia sẻ thông tin chi tiết về nhà nước hoặc các chi tiết triển khai khác trong số các chức năng tôi đang thêm vào. – dasblinkenlight

+0

Cảm ơn bạn !! Tôi sẽ cố gắng bằng cách viết một wrapper trên nó. – EngineeredBrain

0

Tôi sẽ sử dụng một cuộc gọi không đơn và đại biểu đến singleton nếu cần. Bất cứ khi nào bạn có cơ hội để thoát khỏi Singleton, hãy tìm nó.

+0

Có chắc chắn đơn lẻ cần phải tránh, nhưng hóa ra là tốt khi được sử dụng cho một cái gì đó như Logger. điều gì xảy ra nếu tôi cần thêm một số phương thức cùng với các phương thức trong singleton nên tôi kế thừa hoặc viết trình bao bọc (của lớp chỉ với các phương thức tĩnh) trên singleton sử dụng nội bộ singleton. – EngineeredBrain

+0

Đi cho một Wrapper. Đó là những gì tôi có ý nghĩa của 'các cuộc gọi đại biểu'. –

0

Tôi đồng ý với Garret Hall, bạn nên tránh Singleton nếu có. Điều đó nói rằng, tôi không thấy nó là sai vì một lý do. Người thực hiện Singleton cho phép bạn mở rộng nó. Nếu nhà phát triển api không muốn trình đơn lớp Logger được mở rộng, họ sẽ tạo ra hàm tạo riêng tư, trong C++ chẳng hạn, hoặc bất kỳ phương thức nào phù hợp với ngôn ngữ bạn đang sử dụng.

0

tôi nghĩ rằng viết một wrapper trên lớp không phải là giải pháp thích hợp, bởi vì bạn cần phải viết wrapper cho mọi phương pháp bạn cần từ singleton. Và bạn kết thúc bằng văn bản hàng chục chức năng.

Ngoài ra, bạn đang hạn chế bản thân sử dụng tất cả các chức năng có sẵn trong singleton.

KHÔNG PHẢI LÀ Ý TƯỞNG TỐT !!!