2009-04-27 37 views
17

Tôi mới đến C# .Tại thời điểm này, tôi đã sử dụng để tạo mọi biến toàn cục - tĩnh công cộng.Tất cả các phương thức của tôi là tĩnh công khai để tôi có thể truy cập chúng từ các lớp khác.Khi nào tôi nên sử dụng các phương thức công khai/riêng tư/tĩnh?

Tôi đọc trên SO rằng các phương thức tĩnh công khai ít hơn, tốt hơn. Tôi viết lại các ứng dụng của mình bằng cách đặt tất cả mã trong một lớp - lớp biểu mẫu. Tất cả các phương thức của tôi là riêng tư và không có phương thức tĩnh.

Câu hỏi của tôi: Tôi nên làm gì, việc giữ mọi thứ trong lớp biểu mẫu sẽ bị xóa theo ý kiến ​​của tôi.

Khi nào tôi nên sử dụng công khai, khi riêng tư và khi riêng tư/công khai tĩnh?

Tôi nhận được các phương pháp công khai như là một 'khuyết điểm', bởi vì chúng có thể được giải mã, nhưng tôi nghi ngờ rằng các phương pháp công cộng có thể được biên dịch quá. Cái gì là 'riêng' trong một phương pháp riêng tư?

EDIT: Tôi không hỏi làm cách nào để ngăn chương trình của mình bị giải mã, tôi hỏi liệu tôi có nên sử dụng tĩnh, riêng tư và công khai.Và cũng có vấn đề trong việc đặt tất cả mã trong hình thức lớp vì vậy tôi không phải sử dụng phương pháp công cộng?

+0

Câu hỏi của bạn có vẻ như một bản sao của: [http://stackoverflow.com/questions/99688/private -v-công-thành-trong-thực hành-cách-quan trọng-là-đóng gói] (http://stackoverflow.com/questions/99688/private-vs-public-members-in-practice-how-important-is- đóng gói) –

Trả lời

8

tin là cho các thành viên lớp mà bạn muốn truy cập chỉ trong lớp học của cơ thể, và trong C# thành viên là thiết lập mặc định để riêng tư trừ khi được quy định khác nhau

ví dụ về khi sử dụng tin:

class Account 
{ 

    private int pin = 1090; 
    public int Pin 
    { 
    get { return pin; } 
    } 
} 

Mặt khác, mặt khác, ngược lại, không có giới hạn nào khi truy cập vào các thành viên công cộng, vì vậy khi những thứ không quan trọng với người dùng có quyền truy cập phải công khai.

tĩnh, mặt khác không có liên quan đến hai, bởi vì nó không đối phó với sự cho phép phương pháp, mặt khác là một khai báo liên tục hoặc kiểu. Nếu từ tĩnh được áp dụng cho lớp thì mọi thành viên trong lớp phải được khai báo tĩnh.

ví dụ về khi nào sử dụng tĩnh:

static int birth_year= 1985 

Modifiers in C# Reference sẽ cung cấp cho bạn chi tiết hơn của tất cả các bổ ngữ trong C# và ví dụ về cách họ nên được sử dụng

4

Xem Access Modifiers (C# Programming Guide). Nhưng sẽ tốt hơn nếu bạn có cho mình một cuốn sách C# và OOP/OOD phong phú: đây thực sự là những điều cơ bản về khoa học máy tính.

Ngắn câu chuyện: các công cụ sửa đổi truy cập quảng bá đóng gói, về cơ bản có nghĩa là mọi lớp nên giữ bí mật riêng của nó.

3

Tôi sẽ bắt đầu tìm hiểu các khái niệm cơ bản về lập trình hướng đối tượng. Có rất nhiều tài nguyên ngoài kia. Có lẽ tốt nhất là bắt đầu một khóa học. Bạn dường như không hiểu các nguyên tắc OO.

+0

Khi tôi nói "Tôi mới đến C#" Tôi không có nghĩa là tôi newbie. Tôi đã là một người yêu pascal năm trước, tôi chỉ mới đến C#. –

+7

Nó thực sự chỉ là một lời khuyên. Tôi không muốn xúc phạm hay nói rằng bạn không phải là một lập trình giỏi. Nhưng khi bạn nói bạn đã làm "mọi thứ tĩnh" và "đặt mọi thứ vào một lớp để làm cho nó riêng tư" nghe như thể bạn không quen thuộc với lập trình hướng đối tượng. –

0

Điều này có vẻ cơ bản hơn câu hỏi được liên kết ở trên. Để phát triển mạnh trong ngôn ngữ OO, bạn cần tìm ra cách phân tích mục tiêu cuối cùng thành một chuỗi các đối tượng hoạt động cùng nhau (thậm chí có chứa và mở rộng lẫn nhau) để đạt được một loạt mục tiêu. Sự trừu tượng này có nhiều lợi ích trở nên rõ ràng khi bạn bắt đầu thực hiện đúng thiết kế OO. Bạn sẽ muốn có một cuốn C# mới, như đã đề cập, nếu bạn chưa nhận được phần giải thích các khái niệm cơ bản của O bject O Lập trình được riented.

12

Tất cả mọi thứ nên được riêng tư trừ khi chứng minh ngược lại. Sự khác biệt giữa công cộng và riêng tư là giữa những gì được cho là được giữ tương thích và những gì không được cho là tương thích, những gì được cho là thú vị với thế giới và những gì không phải là kinh doanh của nó.

Khi bạn khai báo một cái gì đó công khai, lớp (và do đó đối tượng) đang đưa ra một tuyên bố mạnh mẽ: đây là giao diện hiển thị của tôi, có nhiều cái khác như thế này, nhưng đây là của tôi. Giao diện công khai là thỏa thuận hợp đồng mà lớp học của bạn đang xuất sang phần còn lại của thế giới (bất kể điều đó có nghĩa là gì) về những gì nó có thể làm. Nếu bạn sửa đổi giao diện công cộng, bạn có nguy cơ phá vỡ hợp đồng mà phần còn lại của thế giới đang giả định về lớp.

Mặt khác, nội dung riêng tư nằm trong lớp học. Nó hỗ trợ chức năng mà lớp phải sử dụng để thực hiện công việc của nó trong khi mang trạng thái đối tượng xung quanh (nếu đó là một phương thức) hoặc giữ trạng thái bên trong của nó (nếu đó là một biến). Bạn có thể tự do hack và tinker những thứ riêng tư như bạn muốn, mà không phá vỡ hợp đồng giao diện, nghĩa là điều này cho phép bạn tự do tái cấu trúc (ví dụ, để biểu diễn dữ liệu nội bộ). Công cụ riêng tư không phải là một phần của giao diện.

Được bảo vệ là thứ liên quan đến tính mở để thực hiện lại. Tránh, nếu bạn có thể, thừa kế lồng nhau sâu sắc. Bạn có nguy cơ làm cho mọi việc trở nên rất khó xử lý, vì lớp reimplementation của bạn có thể xoay quanh lớp cơ sở.

Về mặt kỹ thuật, một lớp nên khai báo giao diện (công khai) và triển khai (riêng tư). Giao diện không nên có mã, chỉ cần ủy quyền cho logic "thực hiện" riêng. Đây là lý do tại sao trong Java và C# bạn có câu lệnh giao diện, nó chính thức hóa khái niệm lớp trừu tượng thuần túy trong C++.

Tĩnh là thứ gì đó cư trú hợp lý trong lĩnh vực của lớp học của bạn nhưng không phụ thuộc vào trạng thái của lớp đó. Nó nên được sử dụng một cách tiết kiệm khi một mẫu thiết kế ra lệnh cho nó (ví dụ, singleton, factory method).

4

Tất cả đã được trả lời ở trên, nhưng tôi nghĩ rằng nó có thể được đơn giản hóa một chút ... để trang trí một phương thức công khai, nếu các lớp khác sẽ sử dụng phương pháp này. Nếu không - hãy đánh dấu là riêng tư.

Ví dụ: bạn có Loại ALoại B. Nói Lớp A có 3 phương pháp (x, y, z). Phương pháp x, y sẽ được sử dụng bởi Class B, vì vậy đánh dấu cả hai công cộng, nhưng phương pháp z sẽ chỉ được sử dụng theo phương pháp x bên Class A để đánh dấu nó tin là không có nhu cầu để lộ phương pháp này cho thế giới bên ngoài. Logic bên trong phương pháp này chỉ dành cho mục đích sử dụng nội bộ.

Tĩnh là khác biệt với kiểu trang trí này nghĩa là bạn không thể tạo một thể hiện của đối tượng được đánh dấu là tĩnh. Đối tượng là - như từ khóa cho biết - tĩnh (không thể thay đổi hoặc sửa đổi).

0

Java cung cấp một số công cụ sửa đổi truy cập để đặt mức truy cập cho các lớp, biến, phương thức và hàm tạo. Bốn cấp truy cập là:

Hiển thị với gói, mặc định. Không cần bổ trợ.

Chỉ hiển thị với lớp học (riêng tư).

Hiển thị với mọi người (công khai).

Hiển thị với gói và tất cả các lớp con (được bảo vệ).

Dưới đây là một ví dụ:

public class Xe đạp {

private int cadence; 
private int gear; 
private int speed; 
private int id; 
private static int numberOfBicycles = 0; 

public Bicycle(int startCadence, int startSpeed, int startGear){ 
    gear = startGear; 
    cadence = startCadence; 
    speed = startSpeed; 

    id = ++numberOfBicycles; 
} 

// new method to return the ID instance variable 
public int getID() { 
    return id; 
} 
    ... 

}

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