保護されたもの、内部は何を選択しますか?
-
03-10-2019 - |
質問
私が欲しい方法を持つクラスがあるなら protected
と internal
. 。アセンブリ内の派生クラスのみがそれを呼ぶことができることを望んでいます。
以来 protected internal
意味 protected
また internal
, 、選択をしなければなりません。この場合、何を選びますか - protected
また internal
?
解決
アセンブリ内の派生クラスのみがそれを呼ぶことができることを望んでいます。
それでは、2つの選択肢があります。あなたはそれを保護することができ、あなたの顧客の1人があなたのクラスを拡張してあなたの方法を呼び出してあなたがそれについて知るたびに、あなたは彼らにそれをやめてくださいまたは、それを内部にして、同僚のコードのコードレビューを行い、使用することになっていない方法を使用しないようにすることができます。
私の推測では、後者は安価で簡単なことです。私はそれを内部にします。
他のヒント
個人的に私は保護されたことを選択します。自分のアセンブリのサブクラスがメソッドを呼び出すのに十分な場合、なぜ別のアセンブリにサブクラスがないのでしょうか?おそらく、機能を別の(内部)クラスに完全にリファクタリングすることができます。
メソッドの目的について客観的に考える必要があります。内部アクセシビリティはほとんど常に私に間違っていると感じています。主に、誰かがマークすることを決めたために私がレンガの壁に出会った.NETフレームワークのコントロールやクラスから派生しようとした経験のために クラスまたは 内部としての方法。元の著者は、その方法にアクセスできないほど、サブクラスを実装するのがはるかに難しくなったことに気づかなかった。
編集
明確にするために、クラスの内部アクセシビリティは非常に便利であり、私は一般的に内部を暗示していませんでした。私のポイントは、そうでなければパブリッククラスの内部方法が私には間違っているように見えるということでした。適切に設計された基本クラスは、同じアセンブリの派生クラスに不公平な利点を与えるべきではありません。
正しい選択はそうだと思います internal
. 。このようにして、アセンブリ外の人々をこの方法で呼び出すことを保護できます。他の人がそれを使用するときに注意することを期待するよりも、あなたが書いたアセンブリで注意する方が簡単です。
それはそのような風変わりな決断です protected internal
平均 protected
また internal
. 。この正確なケースのために使用します internal
. 。その理由は、カプセル化が壊れている場合、私はむしろ私であり、むしろ私のコントロールの下にいない誰かになりたいということです。
答えはあなたのニーズに基づいて異なると思います。もし私があなただったら、私はこのようなことをするでしょう:
public class YourClass
{
protected class InnerClass
{
internal void YourMethod()
{
// Your Code
}
}
}