2012-01-11 37 views
6

Tôi đã triển khai một lớp đơn và tiếp tục nhận được cảnh báo rằng phương pháp tôi viết là 'thành viên được bảo vệ mới được khai báo trong lớp con dấu'. Nó không ảnh hưởng đến việc xây dựng nhưng tôi không thực sự muốn bỏ qua các cảnh báo trong trường hợp nó gây ra vấn đề sau này? Tôi hiểu một lớp niêm phong là một lớp mà không thể được thừa kế - vì vậy nó không thể được ghi đè, nhưng tôi vẫn không hiểu tại sao đoạn mã sau sẽ cho tôi cảnh báo (là do sử dụng thiết kế singleton?):'Thành viên được bảo vệ trong cảnh báo lớp kín' (một lớp đơn)

namespace WPFSurfaceApp 
{ 
public sealed class PresentationManager 
{ 
    PresentationManager() 
    { 
    } 

    protected void MethodName() 
    { 
    } 

    public static PresentationManager Instance 
    { 
     get 
     { 
      return Nested.instance; 
     } 
    } 

    class Nested 
    { 
     // Explicit static constructor to tell C# compiler 
     // not to mark type as beforefieldinit 
     static Nested() 
     { 
     } 

     internal static readonly PresentationManager instance = new PresentationManager(); 
    } 
} 

EDIT: Cảnh báo liên quan đến phương thức MethodName(). CHỈNH SỬA: Thay đổi khoảng trống công cộng MethodName() thành void MethodName được bảo vệ()

+0

điều gì sẽ xảy ra nếu bạn tạo lớp 'Nested' là riêng tư? –

+3

Tôi không thấy bất cứ điều gì được bảo vệ ở đó ... –

+0

Không có gì xảy ra, cảnh báo vẫn còn ở đó. Tôi nghĩ rằng thành thật mà nói, nó sẽ không liên quan gì đến thiết kế singleton - nó liên quan nhiều hơn với lớp kín so với modifier truy cập nhưng tôi nghĩ tôi sẽ đề cập đến nó và bao gồm cả mã lớp lồng nhau. –

Trả lời

14

Cảnh báo là vì protected không có ý nghĩa trong lớp không thể kế thừa. Nó sẽ chính xác giống như private cho lớp sealed.

Nó không phải là lỗi, nhưng biên dịch đang cố gắng thu hút sự chú ý của bạn đến thực tế rằng làm cho nó protected thay vì private sẽ cung cấp cho bạn không có lợi và có thể không làm những gì bạn dự định (nếu bạn định được hiển thị cho một lớp con, không thể tồn tại trong lớp được niêm phong).

Vì vậy, có, bạn có thể bỏ qua nó một cách an toàn, nhưng nó không phù hợp về mặt logic để có protected thành viên trong lớp học sealed.

Nhập MSDN cho Compiler Warning CS0628

+0

Cảm ơn James, tôi hiểu ngay bây giờ. Nó chỉ là nó không có ý nghĩa để bảo vệ nó từ bất kỳ lớp học trẻ em vì nó sẽ không có một. Nghĩ rằng nó có thể là một cảnh báo cho một cái gì đó mà có thể đã đi sai như trái ngược với mã hóa vô nghĩa. Có lẽ đã biết điều đó. Tôi đã bối rối vì cảnh báo vẫn còn đó một khi tôi đã thay đổi nó thành công chúng, thậm chí sau nhiều lần xây dựng. Cảm ơn bạn đời. –

4

Điều này là hiển nhiên vì nó không có ý nghĩa gì cả. Điều gì sẽ là sử dụng các thành viên bảo vệ nếu lớp không thể được thừa hưởng

Như MSDN Says

loại tuyên bố các thành viên được bảo vệ để loại kế thừa có thể truy cập hoặc ghi đè lên các thành viên. Theo định nghĩa, bạn không thể kế thừa từ loại kín , có nghĩa là các phương pháp được bảo vệ trên các loại kín có thể không được gọi là .

2

Hãy nghĩ đến khi bạn tự mình xem xét mã. Bạn thấy một cái gì đó mà không có ý nghĩa như xa như bạn có thể nhìn thấy. Có một vài khả năng khả dĩ:

  1. Nhà phát triển đã làm điều gì đó ngu xuẩn.
  2. Nhà phát triển đã làm điều gì đó quá thông minh vì mục đích của nó là hiển nhiên đối với bạn.
  3. Nhà phát triển đã làm điều gì đó hợp lý mà không còn hợp lý nữa do những thay đổi diễn ra trong thời gian đó.
  4. Nhà phát triển đã làm điều gì đó không có ý nghĩa, nhưng sẽ xảy ra nếu thay đổi theo kế hoạch xảy ra.

Trong trường hợp đầu tiên, họ nên khắc phục.

Trong trường hợp thứ hai, chúng phải ghi lại.

Trong trường hợp thứ ba, họ nên thay đổi; nó sẽ tạo ra một chút khác biệt thực tế nhưng mã sẽ có ý nghĩa hơn và nó có thể có một số lợi ích hiệu suất nhỏ.

Trong trường hợp thứ tư, họ nên ghi lại tài liệu trong thời gian này và thực hiện thay đổi đó hoặc quay lại sớm hơn là sau này.

Dù bằng cách nào, bạn cũng sẽ muốn thảo luận với họ.

Cũng giống như ở đây, không có ý nghĩa gì khi thêm thành viên được bảo vệ vào lớp được niêm phong. Tôi không biết tại sao bạn đã làm điều đó, và không thể quyết định xem bốn trường hợp nào ở trên được áp dụng, nhưng một trong số đó là có. Cảnh báo nêu bật điều này. Thực hiện bất kỳ hành động nào trong bốn hành động theo bốn trường hợp nào có hiệu lực.

0

Tôi nói bạn đang chơi với C#. Nghiêm túc !!
Trong một lớp tĩnh, người ta nói rằng chúng ta không thể khai báo các thành viên được bảo vệ vì các lớp tĩnh không thể được khởi tạo. Trong thực tế, khi chúng ta viết các thành viên được bảo vệ trong các lớp tĩnh, nó sẽ ném một lỗi trong quá trình xây dựng.
Trong một lớp kín, nó sẽ ném một cảnh báo trong khi xây dựng. Tôi đoán như các lớp tĩnh, các lớp được niêm phong cũng nên đưa ra một L ERI và không phải là CẢNH BÁO. Nếu sự khác biệt này nên có thì tại sao?

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