2009-12-28 121 views
4

是否有任何OOP語言中的對象私有的概念?我的意思是比經典的專用訪問更具限制性?object-private Vs class-private

Private (or class-private) restricts the access to the class itself. Only methods that are part of the same class can access private members.

對象私有:限制訪問對象本身。只有方法的對象可以訪問的成員,這將是不可能寫:

public class Person { 

private String secret; 
public String othersSecret; 

public void snoop(Person p) { 
    othersSecret = p.secret; //will be prohibited by the compiler 
} 

編輯:

如果它存在,你可以給我一些例子......如果不是你認爲這是有趣的有這種功能?是否有可能在其他OOP語言中模擬它?

編輯2: 感謝你們,所有的答案都非常有啓發...

到現在爲止,臨時結論

instance-private概念在兩種語言存在:

1 - Smalltalk經過數小時的谷歌搜索:)我發現這個概念背後的語言!

The state an object holds is always private to that object. Other objects can query or change that state only by sending requests (messages) to the object to do so.

2 - 紅寶石感謝洛根

One person summed up the distinctions by saying that in C++, 「private」 means 「private to this class」, while in Ruby it means 「private to this instance」. What this means, in C++ from code in class A, you can access any private method for any other object of type A. In Ruby, you can not: you can only access private methods for your instance of object, and not for any other object instance (of class A).

+0

我剛編輯我的文章更清晰......我問理論......在任何OOP語言... – 2009-12-28 17:09:37

+0

讓我走的事情之一'吧?'通過C#,AFAIK它只支持類私有。 – 2009-12-28 17:41:30

+0

@Johannes:'class-private'是OOP語言(C#,java ...)處理封裝的正常方式...直到現在我只能看到允許'object-private'的Ruby(感謝Logan).. – 2009-12-28 18:31:41

回答

3

在ruby中,每個對象的私有是唯一的私有的(你必須使用protected來獲得類的私有行爲)。

E.g. foo.rb:

class A 
    private 
    def a=(x) 
      @a=x 
    end 
    public 
    def a 
      @a 
    end 

    def b(c) 
      c.a = 2 
    end 
end 

a1 = A.new 
a2 = A.new 
a1.b(a2) 

運行它,我們得到

foo.rb:12:in `b': private method `a=' called for #<A:0xb7c9b6e0> (NoMethodError) 
    from foo.rb:18 

當然也有解決這個辦法,但幾乎總是。

+0

非常有趣的例子!我想知道是否有其他語言支持這一點......以及爲什麼它不是其他語言的OOP語言的標準...... – 2009-12-28 18:23:39

+1

有些種類的OO功能只在某些語言中才會顯示。對於一些有趣的例子(例如,多方法,元類和方法組合(例如:before,:after和:around),其中後兩個預製的面向方面的編程),參見CLOS。 – outis 2009-12-28 20:46:33

+0

@outis:在CLOS中我最喜歡的是當我們使用call-next-method時,多重繼承中的調用的線性化...大到CLOS;) – 2009-12-28 21:04:10

0

我不認爲這種階級的區別VS對象private存在最普遍的語言OO例如C#,C++,Python,Java,Objective-C ......公平地說,我記不起實際上具有此功能的語言。

1

在Java中,它看起來像你正在寫的,「私有」意味着類私有。沒有辦法強制對象私有模式。原因是「私人」是一種強制執行封裝,而不是安全

0

是的,您可以在Java中創建包含實例變量的對象,該實例變量的其他實例無法看到。簡單的例子:

class Secretive { } 
Secretive s = new Secretive() { 
    int unknowable = 42; 
}; 
Secretive t = new Secretive() { 
    String unfathomable = "banana"; 
}; 
+1

這不完全正確。在你的例子中,你創建了兩個新的匿名類,併爲每個類創建一個實例。因此,每個實例都可以擁有對其(匿名)類專用的數據,但這與將數據隱藏到實例中並不完全相同。 – 2009-12-28 17:24:11

0
public class Person 
    { 
     private String privateSecret; 
     public String PublicInformation; 

     public void Snoop(Person p) 
     { 
      // will be allowed by the .NET compiler 
      p.PublicInformation = p.privateSecret; 
     } 
    } 

只使用性能,或只讀領域執行你安全

你也可以使用內部訪問者來欺騙你的班級assambley。

您也可以使用一些拒絕技術,如this one

+0

它也將被允許通過javac和所有oop compiller我知道...我問是否有語言誰提供其他級別的封裝,禁止這... – 2009-12-28 17:17:49

+0

@Paolo:這不是「怪異」,這是正常的方式OOP語言處理封裝......這就是爲什麼我問我的問題:) – 2009-12-28 17:25:29

2

我認爲你想要的功能可以通過比喻來實現,不允許人員直接溝通。 要以最小的努力達到此目的,您可以引入一個界面,該界面不會提供您想要保密的內容。

public interface IPerson 
{ 
    void communicateFormally(); 
} 

public class Person : IPerson 
{ 
    private String secret; 
    public String othersSecret; 

    public void snoop(IPerson p) { 
     othersSecret = p.secret; //will be prohibited by the compiler 
    } 
    ... 
} 

現在,這可能是由一個醜陋的演員「黑客」,但我認爲這是一個黑客的問題。

+0

但這會給我們一個「pivotate-interface」功能......不是像「Logan Capaldo」ruby例子那樣的「私人對象」... – 2009-12-28 18:13:18

2
+0

請參閱pdf「對象編程語言中的封裝和繼承」http://eprints.kfupm.edu.sa/37524/1/37524.pdf – igouy 2009-12-29 19:08:29

+0

請參見「Smalltalk背後的設計原理」http://www.cs.virginia埃杜/〜埃文斯/ cs655 /讀數/ Smalltalk的。html – igouy 2009-12-29 19:09:29

+0

@igouy:thx文章... – 2009-12-29 20:44:52

相關問題