2012-12-09 36 views
-1

我有這個簡單的代碼:Class比OOP規則更喜歡它的私有成員?

public class A 
{ 
    int _private=3; 
    public A (B b) 
    { 
     b._private=5; 
    } 

} 

public class B:A 
{ 
} 

此代碼編譯

  • 通過OOP - 在b應該_private提供接入。

  • 通過私有和A,A知道_private,但仍然通過b進行訪問!

這是怎麼回事?

+4

那麼,'B'是'A'的_type_,'A'可以訪問它自己的變量......你在做什麼是一個真正的代碼異味(使用繼承類型的基類)。 – Oded

+0

@Oded:我不會說這種代碼味道 - 它是描述層次結構的常用模式,一個'Node'類有兩個子類'Parent'和'Leaf',其中每個'Node'使用'Parent'作爲其父節點的引用。 –

+0

@ O.R.Mapper - 少數例外之一。 – Oded

回答

4

私有訪問修飾符允許訪問聲明類型的主體中的成員。 b是另一個例子,這並不重要。它是A,因此在A內聲明的方法可以訪問_private。我也注意到,這個例子是或多或少直接從C#4.0規範中,有關輔助域3.5.2節:

class A 
{ 
    int x; 

    static void F(B b) { 
     b.x = 1; // Ok 
    } 
} 

class B: A 
{ 
    static void F(B b) { 
     b.x = 1; // Error, x not accessible 
    } 
} 

我想的OOP建議信息隱藏是有關指定爲客戶合同碼。公共是支持的東西。私有是一個實現細節。在這裏,我們可以通過刪除_private來修改A的實現,並且客戶端代碼將不受影響。