2010-06-22 40 views
9

Trong khi nghiên cứu C# trong ASP.net, tôi gặp khó khăn khi hiểu nhiều lớp. Trong trường hợp nào tôi nên sử dụng các lớp sau đây private,public,protected,abstract,static,sealed?Cách sử dụng "Lớp" trong C#

Sẽ tốt hơn nếu ai đó có thể giải thích điều này với các ví dụ dễ dàng.

+14

bạn cần đọc Bắt đầu C# 2005/2008. Chúng tôi không thể giải thích cho bạn toàn bộ bách khoa toàn thư của C#. –

+2

Tôi nghĩ rằng SO bây giờ nên xem xét một số hướng dẫn về đặt câu hỏi, chúng tôi không thể dạy bất cứ ai "làm thế nào để chương trình" ở đây hoặc giải thích những gì đã tồn tại trong MSDN hoặc hướng dẫn trợ giúp. –

+0

Tôi khuyên bạn nên đọc một chút về tính đa hình @ http://msdn.microsoft.com/en-us/library/ms173152%28v=VS.80%29.aspx ví dụ – KroaX

Trả lời

19

Đó không phải là lớp học.

private, protectedpublic là công cụ sửa đổi truy cập. Họ chỉ ra khác mã có thể xem mã họ ảnh hưởng đến:

public class Foo 
{ 
    private int _myOwn = 1; 
    protected int _mineAndChildren = 2; 
    public int _everyOnes = 3; 
} 

public class Bar : Foo 
{ 
    public void Method() 
    { 
     _myOwn = 2; // Illegal - can't access private member 
     _mineAndChildren = 3; // Works 
     _everyOnes = 4; // Works 
    } 
} 

public class Unrelated 
{ 
    public void Method() 
    { 
     Foo instance = new Foo(); 
     instance._myOwn = 2; // Illegal - can't access private member 
     instance._mineAndChildren = 3; // Illegal 
     instance._everyOnes = 4; // Works 
    } 
} 

Một lớp abstract là một trong đó có thể chứa abstract thành viên. Thành viên abstract không có triển khai, vì vậy tất cả các lớp dẫn xuất phải triển khai các thành viên abstract.

Không thể kế thừa lớp học sealed. Lớp học staticsealed, nhưng cũng chỉ có thể chứa static thành viên.

Tôi đề nghị bạn bắt đầu bằng "Getting Started with Visual C#. Đây là một câu hỏi rất cơ bản.

+0

Làm thế nào để _everyOnes hoạt động trong lớp Không liên quan? Bạn sẽ cần một cá thể của Foo hoặc Bar để truy cập trường _everyOnes. – lxalln

+0

@CnTwo: bắt tốt. Lỗi sao chép và dán. –

+0

Cảm ơn bạn rất nhiều vì các ví dụ có giải thích. – Hoque

0

privatepublic tham khảo khả năng hiển thị của lớp bên ngoài lắp ráp (ví dụ DLL hay EXE), nó sống ở. protected là một modifier cho các phương pháp, nó có nghĩa là chỉ có lớp kế thừa từ declarator có thể gọi phương thức.

abstract xác định một lớp học mà không thể được tạo trực tiếp, và được thiết kế chỉ để cung cấp một cơ sở cho các lớp khác.

Áp dụng cho phương pháp, static có nghĩa là họ có thể được truy cập như là một phần của các loại, chứ không phải là một thể hiện của lớp:

class Bar { 
    static void Foo() { ... } 
    void Foo() { ... } 
} 

Người đầu tiên có thể được gọi như thế này:

Bar.Foo(); 

thứ hai chỉ thích này:

Bar b = new Bar(); 
b.Foo(); 

Áp dụng cho lớp học, static giới hạn lớp chỉ chứa phương pháp tĩnh. Nó thẩm mỹ hơn bất cứ thứ gì khác, nhưng nó cũng giúp trình biên dịch.

Trình sửa đổi sealed cho trình biên dịch biết rằng một lớp không thể được kế thừa từ đó.

1

Những gì bạn có ở đó là các công cụ sửa đổi, không phải là loại lớp.

private, publicprotectedAccess Modifiers. Chúng xác định cách bạn có thể truy cập mã.

Trước khi xem xét các công cụ sửa đổi khác mà bạn đã liệt kê, tôi khuyên bạn nên nắm bắt về Lập trình hướng đối tượng. Here là liên kết có nhiều tài nguyên tốt mà bạn có thể xem xét.

8

public, privateprotected không lớp học , chúng là các công cụ sửa đổi truy cập. Họ thay đổi những gì được phép truy cập vào các lớp học mà bạn trang trí với họ. Họ áp dụng cho các lớp học cũng như các thành viên của lớp học.

  • public mục này có thể được nhìn thấy từ bất cứ nơi nào
  • private lớp chỉ có thể được nhìn thấy từ bên trong cùng một tập tin
  • private thành viên của lớp học chỉ có thể được nhìn thấy trong lớp đó
  • protected thành viên có thể nhìn thấy từ bên trong lớp học và hậu duệ của nó
  • internal các lớp học là công khai trong cùng một hội đồng.

Từ khóa abstract đánh dấu một lớp hoặc phương pháp là có không thực hiện, và nó phải được ghi đè (với từ khóa override) trong một loại có nguồn gốc trước khi bạn có thể sử dụng nó.

Không thể kế thừa lớp học sealed.

Sử dụng từ khóa static trên một thành viên lớp cho biết rằng thành viên thuộc về chính lớp đó, chứ không phải là một trường hợp cụ thể của lớp đó. Đánh dấu một lớp là static áp đặt hạn chế là tất cả các thành viên của lớp này cũng phải là static.

+3

+1 cho một câu trả lời tuyệt vời, sắc nét và cho điểm. Hãy thận trọng với từ khóa tĩnh ... nếu bạn khai báo một biến là tĩnh trong một ứng dụng web ASP.NET thì biến tương tự sẽ được sử dụng cho mỗi người dùng duy nhất của ứng dụng !! ... do đó sẽ rất không khôn ngoan khi lưu trữ tên người dùng/mật khẩu (dữ liệu nhạy cảm) trong một biến tĩnh vì những người dùng khác cũng có thể xem dữ liệu! – Dal

+0

@Dal: lưu ý lý do cho điều này - thành viên tĩnh thuộc về lớp. Tất cả các yêu cầu, bất kể người dùng, sẽ sử dụng cùng một lớp, do đó cùng một thành viên tĩnh. –

+0

@ John - Yep hoàn toàn hiểu, tôi đã học được từ một bài học khó mà tôi đã từng lưu trữ productID như một biến tĩnh trong một ứng dụng web ... đã không mất nhiều thời gian cho tất cả các vấn đề xảy ra (ví dụ:) ... bài học kinh nghiệm :) – Dal

5

private, publicprotected cho biết ai có thể truy cập thành viên của một lớp học. tư nhân có nghĩa là không ai ngoài lớp học có thể nhìn thấy nó. công cộng có nghĩa là mọi người đều có thể nhìn thấy nó. được bảo vệ giống như riêng tư, nhưng các lớp con có thể truy cập nó.

class Data 
{ 
    private int counter; // only accessible to class functions 
    protected int id; // accessible to class and subclass functions 
    public string name; // accessible from all code 
} 

abstract có nghĩa đây không phải là lớp đã hoàn thành - nó có nghĩa là được sử dụng làm cơ sở cho lớp con. Thường thì có các hàm ảo trong định nghĩa của nó, các hàm được định nghĩa là "được điền" bởi một lớp con.

abstract class Window 
{ 
    // cannot create objects of this class directly 
    // need to create sub class 
} 

static trên định nghĩa lớp nghĩa là chỉ có một bản sao chung. Nó khá nhiều chuyển đổi lớp thành một mô-đun kiểu cũ. static đối với một thành viên chỉ ra rằng nó là một thành viên toàn cầu trong lớp, không có một phiên bản khác nhau cho mọi đối tượng bạn thực hiện của lớp đó.

static class Configuration 
{ 
    // only one instance of the object 
} 

class Data 
{ 
    private static int counter; // all Data objects access this one counter 
    private int id;    // each Data object has a different id 
} 

sealed ngăn các lớp con được tạo; nó cũng có thể được áp dụng cho các hàm riêng lẻ để ngăn chúng bị ghi đè trong một lớp con.

sealed class TelephoneNumber 
{ 
    // cannot create subclass of TelephoneNumber 
} 

class Address 
{ 
    public sealed string FormatAddress() 
    { 
     // this function cannot be overridden on a subclass 
    } 
} 
3

Tôi không thể nhận xét câu hỏi của bạn nhưng tôi có một chút yêu cầu nhưng thông tin importan cho bạn.

công cụ sửa đổi truy cập chỉ là tính năng trình biên dịch. mọi .net-programm có thể bỏ qua điều này bằng cách sử dụng sự phản chiếu và có thể truy cập các lớp và phương thức riêng của bạn.

Một exampel:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 

namespace ReflectPrivateMembers 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ConstructorInfo ci = typeof(Hello).GetConstructor(BindingFlags.NonPublic| BindingFlags.Instance ,null,System.Type.EmptyTypes,null); 
      object helloObject = ci.Invoke(System.Type.EmptyTypes); 
      MethodInfo[] helloObjectMethods = helloObject.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly| BindingFlags.Instance); 

      foreach (MethodInfo mi in helloObjectMethods) 
      { 
       mi.Invoke(helloObject, System.Type.EmptyTypes); 
      } 
      Console.ReadLine(); 
     } 
    } 
    public class Hello 
    { 
     private Hello() 
     { 
      Console.WriteLine("Private Constructor"); 
     } 
     public void HelloPub() 
     { 
      Console.WriteLine("Public Hello"); 
     } 
     private void HelloPriv() 
     { 
      Console.WriteLine("Private Hello"); 
     } 
    } 
} 

Nguồn: Reflection with Private Members

+3

Truy cập sửa đổi không phải là một cơ chế bảo mật, chúng ở đó để thực thi các mẫu lập trình. Điểm lấy, nhưng vẫn ... – tylerl

2

Ba đầu tiên là bổ tiếp cận, họ có thể được áp dụng cho các loại và các thành viên. riêng có nghĩa là một cái gì đó chỉ có thể được truy cập từ bên trong loại khai báo của nó. được bảo vệ có nghĩa là một cái gì đó có thể được truy cập bởi người kế thừa loại khai báo hoặc theo thứ gì đó trong chính loại đó. công khai có nghĩa là một cái gì đó có thể được truy cập từ bất kỳ nơi nào có tham chiếu hợp lệ đến loại khai báo.

Phần còn lại cũng có thể được áp dụng cho cả loại và thành viên. trừu tượng(trên một thành viên) có nghĩa là thành viên không có người thực hiện (thực hiện phải được cung cấp bởi những người thừa kế của các loại) hoặc (trên một loại) rằng loại không thể được khởi tạo (chỉ thừa hưởng). tĩnh(trên một thành viên) có nghĩa là các thành viên được chia sẻ tĩnh bởi tất cả người gọi, hoặc (trên một loại) rằng loại chỉ có thể chứa các thành viên tĩnh và do đó không thể được khởi tạo (tức là nó không có bất kỳ thành viên cá thể nào và do đó không thể phục vụ bất kỳ trường hợp nào của chính nó). bịt kín(trên thành viên ảo hoặc trừu tượng kế thừa) có nghĩa là người thừa kế loại không thể ghi đè thành viên hoặc (trên loại) không thể kế thừa loại.

Có một vài từ bổ nghĩa khác mà bạn cần phải nhận thức: nội là một modifier truy cập có nghĩa là điều gì đó có thể được truy cập bởi bất cứ điều gì trong cùng một assembly (hoặc dự án) như các loại tuyên bố.

Ngoài ra, ảo(trên một thành viên) có nghĩa là các thành viên có thể tùy chọn được ghi đè bởi một người thừa kế của các loại, nhưng cung cấp thực hiện mặc định riêng của mình. một phần(trên thành viên) cho phép bạn cung cấp chữ ký của thành viên trong một tệp và triển khai một thành viên khác hoặc (theo loại) cho phép bạn chia tách định nghĩa loại trên nhiều mã các tập tin.

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