2010-02-01 33 views
12

Cho lớp A chứa bộ dữ liệu thô và lớp B, chứa phiên bản được sắp xếp lại (GUI sẵn sàng) của dữ liệu đó tôi muốn làm cho dữ liệu thô trong A hiển thị trong B.C# Các lớp bạn bè và thành phần OOP

Rõ ràng dữ liệu thô trong lớp A được chứa trong các thành viên riêng tư. Tôi muốn làm cho dữ liệu đó có thể nhìn thấy trong B mặc dù việc sử dụng một cái gì đó giống như phương pháp lớp người bạn C++.

Tôi làm cách nào để tiếp cận điều này?

Cảm ơn bạn.

Trả lời

10

Nói đúng, bạn không thể xác định một lớp cụ thể (hoặc danh sách các lớp) mà bạn có thể hiển thị dữ liệu. Tuy nhiên, bạn có thể sử dụng công cụ sửa đổi truy cập internal thay vì private, làm cho các thành viên có sẵn cho bất kỳ lớp nào trong cùng một hội đồng.

Điều đó đang được nói, bạn nên mạnh mẽ xem xét việc hiển thị các thành viên này thông qua các thuộc tính chứ không phải là trường (đó là những gì tôi đoán bạn đang lên kế hoạch vạch trần). Việc này sẽ cho phép lớp xác định chính xác cách thông tin đó có thể được tiếp xúc với các lớp khác và những gì - nếu có - sẽ xảy ra khi một lớp khác thay đổi dữ liệu.

+1

'internal' + properties = an toàn. –

+0

Điều này có vẻ giống như một trường hợp cho một trong hai thuộc tính nội bộ * hoặc có thể là * giao diện nội bộ * mà lớp dữ liệu nguồn A thực hiện cho phép B truy cập một số thành viên riêng tư mà không bị ràng buộc quá mức với A. – LBushkin

+1

@LBushkin: Giao diện nội bộ chắc chắn là một giải pháp, nhưng có vẻ như không cần thiết trừ khi thực sự có nhiều hơn một lớp thực hiện nó. –

1

Bạn có thể xác định cả trong một hội đồng và đánh dấu các trường trong A là "nội bộ".

Một cách tiếp cận OO khác là cung cấp một tập hợp các phương thức công khai trong A cho phép truy cập vào dữ liệu (hoặc một tập hợp con dữ liệu), thường thông qua các thuộc tính đơn giản.

0

Tùy thuộc vào cấu trúc của bạn, bạn có thể sử dụng các lớp học Một phần. Điều này có nghĩa là Dữ liệu và Giao diện người dùng thực sự là cả trong cùng một lớp, nhưng bạn có chúng trong các tệp khác nhau.

Nếu điều đó không hiệu quả với bạn, thì bạn đã có các biến phạm vi nội bộ thay thế hoặc làm việc với Tập dữ liệu mà giao diện người dùng đại diện theo cách tổng quát hơn.

0

Các phương pháp cũ (ý định chơi chữ) sẽ được xác định đơn giản getValue()setValue() chức năng để trả lại giá trị đó để những giá trị này sẽ trở nên không thể tiếp cận mà không cần dùng các chức năng này, trong C# các chức năng này là thành viên được xác định trước được gọi là thuộc tính.

class TestMethod{ 
private int Secret; 

get { return Secret;} 
set { Secret = value;} 
} 

Phương pháp khác là, như những người khác đã nêu trước tôi, chỉ cần sử dụng công cụ sửa đổi internal.

7

Có thể điều này có thể giúp bạn ..

public class A 
{ 
    public A() { } 

    public string AccessData(object accessor) 
    { 
     if (accessor is B) 
      return "private_data"; 
     else 
      throw new UnauthorizedAccessException(); 
    } 
} 

public class B 
{ 
    public B() { } 

    private void AccessDataFromA() 
    { 
     Console.WriteLine(new A().AccessData(this)); 
    } 
} 
+2

Đây là một cách thông minh để thực hiện ngữ nghĩa của 'người bạn'.Tôi không luôn luôn sử dụng 'friend', nhưng khi tôi làm, tôi sử dụng mẫu accessor này :-) –

+1

Nhưng điều này chỉ phá vỡ an toàn thời gian biên dịch. Tôi khá có thể sử dụng bất kỳ lớp nào để 'AccessData' ở đây và trình biên dịch sẽ không phàn nàn. –

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