0

C# クラスのデータ メンバー (フィールドまたはプロパティ) は、プライベート、パブリック、または保護のいずれかになります。

メンバー メソッド専用のプライベート フィールドを使用し、外部に公開しないようにしたい場合はどうすればよいですか?

カプセル化などを壊すことなく、引き続きプライベート フィールドを使用できますか?

私が理解していないのは、2 つの概念です。外の世界に公開する必要があるデータと、公開する必要のないデータ (クラスの周辺) です。

クラスの構築について話しているときに、これら 2 種類のデータとは何ですか?

以下の例では、プライベート フィールド 'name' はクラスに対してプライベートですが、外部の世界から取得/設定可能です。ここでの抽象化は、「「ここに行く」のように直接公開するのではなく、アクセスまたは更新の間接的なメカニズムを追加することですか?? これは、パブリック フィールドとパブリック プロパティについて話しているときに、ここで話しているカプセル化ですか?

class Employee2
{
    private string name = "Harry Potter";
    private double salary = 100.0;

    public string GetName()
    {
        return name;
    }

    public void SetName(string title, string fullName)
    {
       this.name = title + fullName;        
    }

    public double Salary
    {
        get { return salary; }
    }
}

class PrivateTest
{
    static void Main()
    {
        Employee2 e = new Employee2();

        // The data members are inaccessible (private), so 
        // they can't be accessed like this: 
        //    string n = e.name; 
        //    double s = e.salary; 

        // 'name' is indirectly accessed via method: 
        string n = e.GetName();

        // 'salary' is indirectly accessed via property 
        double s = e.Salary;
    }
}
4

3 に答える 3

3

キーワードを使用するとprotected、プロパティまたはメソッドが宣言されているクラス内から、およびこのメンバーを宣言したクラスから派生したクラス内からアクセスできるように制限できます。(MSDN)

class Employee2
{
    private string name = "Harry Potter";
    private double salary = 100.0;

    protected string GetName()
    {
        return name;
    }

    protected string SetName(string newName)
    {
        this.name = newName;
    }

    protected double Salary
    {
        get { return salary; }

    }
}
于 2013-04-30T15:09:09.557 に答える
0

カプセル化とは、オブジェクトの内部表現が、通常、オブジェクトの定義の外では見えないように隠されていることを意味します。通常、フィールドを直接検査または操作できるのは、オブジェクト自体のメソッドのみです。

       private decimal accountBalance = 500.00m;

       public decimal CheckBalance() 
          {
            return accountBalance;
          }

get と set は、オブジェクト メンバーの値の変更時にイベントをトリガーするのに役立ちます。

于 2013-04-30T15:12:00.190 に答える
0

実際のフィールドをパブリックにするだけでパブリックな get/set アクセサーを使用することの意味を尋ねている場合、それは、クライアント コードを変更することなく、そのフィールドのクラスのプライベート実装を後で自由に変更できるためです。たとえば、セッターが有効な入力を取得しているかどうかのチェックを追加したり、プライベート フィールドのデータ型を完全に変更したりしても、セッターで正しく変換することができます。

編集:

SetName()解説で述べたように、奇妙な追加です。文字列を返すのではなく、実際に名前を変更する必要があります(そしてパラメーターを受け取ります)。

于 2013-04-30T15:05:39.523 に答える