問題タブ [access-specifier]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - メソッドをインターフェースで公開し、実装で保護することの利点は何ですか?
私の C++ アプリケーションには、次のようなインターフェイスがあります。
次のようなこのインターフェイスの実装があります。
今、私の同僚はこれについて不平を言い、calculateValue メソッドを保護したほうがよいと私に言いました。そうすれば、呼び出し元が直接の実装ではなく、常にインターフェイスを介して渡されることを保証できます。
これは正しい観察ですか?インターフェイスの実装を保護する方が本当に良いのでしょうか? それとも非公開にすることすらできないのですか?
ruby - ruby では、なぜ include がプライベートで、extend がパブリックなのですか?
ruby では、パブリックであるのinclude
にプライベートである理由は何ですか?Object#extend
ruby - Ruby のプライベート メソッドを理解する
これはもちろん機能しません。明示的な受信者 - Example ( e
) のインスタンスを指定したためです。これは「プライベート ルール」に違反しています。
しかし、なぜRubyでこれができないのか理解できません:
public_m
メソッド定義内の現在のオブジェクト(つまりself
) は Foo のインスタンスです。では、なぜ許可されないのでしょうか。self.private_m
それを修正するには、 justに変更する必要がありprivate_m
ます。しかし、なぜこれが異なるのですか? self
Foo のインスタンスではありませんpublic_m
か? そして、裸のprivate_m
電話の受信者は誰ですか? そうではありませんself
- 実際に省略したのは、Ruby がそれを行う (自分自身で private_m を呼び出す) からです。
あまり混乱していないことを願っています。私はまだRubyに慣れていません。
編集:すべての回答ありがとうございます。それらをすべてまとめると、私は(ついに)明白なself
ことを理解することができました(Rubyのようなものを見たことがない人にとってはそれほど明白ではありません). したがって、プライベート メソッドを呼び出したい場合は、2 つのルールがあります:self
暗黙的な受信者でなければならず、その自己は現在のクラスのインスタンスでなければなりません (Example
その場合、これはインスタンス メソッド定義内にある場合にのみ発生します。メソッドの実行)。間違っている場合は修正してください。
Google Trail でこの質問を見つけた人へのメッセージ: これは役に立つかもしれません - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby
c++ - 基本クラスの「デフォルト」アクセス指定子の違いの根拠
C++ ではstruct
との間にほとんど違いがないことを私は知っています。class
また、いくつかの違いの理由も理解しています。このように、
- struct のメンバーはデフォルトで public です。class のメンバーは
デフォルトで private です。struct のメンバーがデフォルトで public になって
C++-struct
いるのは、 との互換性を持たせるためC-struct
です。また、クラスのメンバーがデフォルトでプライベートである理由は、データのカプセル化の概念を導入するためです(つまり、オブジェクト指向の原則/テクニック/その他を適用します)。
私が理解していないのは、標準 $11.2/2 [class.access.base] を引用して、これです
基本クラスのアクセス指定子がない場合、派生クラスが struct として宣言されている場合は public が想定され、クラスが class として宣言されている場合は private が想定されます。
このねじれと反均一性の根拠は何ですか? なぜこの違いが必要なのですか?
標準からの例、
ここで、B は D2、D4、および D6 のパブリック ベース、D1、D3、および D5 のプライベート ベース、および D7 および D8 の保護ベースです。
編集
構造体とクラスのデフォルトのアクセスが異なることを考えると、この違いは理にかなっていると言う人もいるかもしれません (違いは上記の箇条書きに示されています)。しかし、どのように派生させても、inherited-struct
完全に(継承をサポートしていない)と互換性がないと思います。C-struct
私は間違っているかもしれませんが。そのため、おそらく例を使用して、適切な説明を求めています! :-)
c++ - 保護されたデータメンバーとデータ機能
クラスで保護されたデータメンバーを宣言すると、それは外界にはアクセスできないが、派生クラスにはアクセスできないことを意味します。私の質問は
派生クラスから派生したクラスにアクセスできますか?
c++ - アクセス指定子は絶対確実ではありませんか?
こんなクラスだったら、
そうすると、外部から X にアクセスできなくなるので、これは違法です。
しかし、クラスを編集せずにアクセスできるようにすることができます! 私たちがする必要があるのはこれだけです。
ideone の作業コード: http://www.ideone.com/FaGpZ
つまり、クラス定義の直前、または , の前にそのようなマクロを定義することで、アクセス指定子を変更できます#include <headerfile.h>
。
C++ (マクロ/アクセス指定子/その他) の問題ではありませんか?
とにかく、このトピックのポイントは次のとおりです。
マクロを使用すると、カプセル化を簡単に破ることができます。アクセス指定子は絶対確実ではありません! 私は正しいですか?
c# - 私のC#プライベートクラスはDLL内のどこからでもアクセスできますが、内部の用途は何ですか?
C#にClassLibraryプロジェクトがあり、すべての「プライベートクラス」(異なる名前空間の下)は、同じアセンブリ(プロジェクト)内で相互にアクセスできます。
これで、Class1()はClass2()クラスのインスタンスにアクセスして作成できます[たとえば... new MyClass2App.Class2()]。はい、これらのクラス(Class1()およびClass2())はアセンブリの外部からアクセスできません。これらのクラスが「内部」として作成された場合と同じ動作です。クラスレベルで適用した場合の「プライベート」および「内部」アクセス指定子の実際の使用/違いを理解するのを誰かが助けてくれますか?
ありがとう!
c++ - C++0x decltype を使用したアクセス指定子の回避
次のコードを検討してください。
コンパイラはこれを拒否します - A::B は非公開であるため、g は A::B を返すことができません。
しかし、ここで decltype を使用して g の戻り値を指定するとします。
突然、正常にコンパイルされます (g++ >= 4.4 で)。
したがって、基本的には decltype を使用して、C++98 ではできなかった方法でアクセス指定子を回避しました。
これは意図的なものですか?これは良い習慣ですか?
java - Javaチュートリアルでは、パッケージとプライベートのインターフェイスを使用できると書かれていますが、できません。
Javaチュートリアル「インターフェイスの定義」では、次のように述べています。
インターフェイスがであると指定しない場合、インターフェイスは
public
、インターフェイスと同じパッケージで定義されたクラスにのみアクセスできます。
しかし、これは
NewClass
弱いアクセス権限を割り当てようとしているため、コンパイラエラーが生成されます。公開されました」。それで、ドキュメントが間違っている、または私が何か間違ったことをした、または私がドキュメントを誤って解釈したのですか?
インターフェイスを使用する必要はないと思います。インターフェイスが適切に整理されているので気に入っています。
c++ - C++ アクセス指定子
公的権利と私的権利の概念を確実に把握したいだけです。
プライベートアクセス指定子に関して、それは次のことを意味しますか:
- クラス内のみアクセス可能
- それらにアクセスするために使用できる public クラス メソッドがない限り、クラスのオブジェクトからアクセスすることはできません (他のオブジェクトはそれらの public 関数を使用できますか? )
- 他のオブジェクトはそれらにアクセスできません
そして公開の場合:
- クラスのオブジェクトからアクセス
- 他のオブジェクトからアクセス
そうですか?