2015-10-29 1 views
5

C#では、継承されたクラスでクラスメンバを表示できるようにするアクセッサをprotectedとしましたが、それ以外のクラスメンバは表示しません。C#で保護されたアクセサーを迅速に考える正しい方法は何ですか?

私はベースの上に、この変数を使用して変数(内部動作)と、パブリックメソッドを持つようにしたい:スウィフトで

は、これは私がこのような何かのための正しいアプローチは何だろので、存在しません。クラス。この変数は、継承されたクラスターでも使用されます。私は

  • 参照

オプションは、基本クラスを忘れると、どこでも、私はそれを必要とする変数やメソッドを実装します。 誤って、重複したコード

  • 構成によって継承を実装します。私は一般的なメソッドを含むクラスを作成し、これは継承の代わりに合成によって使用されます。 LESS WRONGが残っていますが、継承で回避できるコードを繰り返しています。
  • 継承を実装し、基本クラスで内部変数を作成します。 WRONGは、継承されたクラスの可視性を許可する以外は正当な理由なしに物事を公開します。
  • 基本クラスの実装の詳細

    私はNSOperationQueueインスタンスとし、キューに入れられた操作をキャンセルするパブリックメソッドを持っていると思います。継承されたクラスからこのキューに新しい操作を追加します。

    答えて

    3

    スウィフトでは、正解はほとんどの場合プロトコルと拡張です。それはほとんど決して継承されません。ココアにはプロトコルよりも頻繁にクラスが存在するため、時にはココアが邪魔になることもありますが、目標はほとんどの場合プロトコルと拡張です。サブクラス化は私たちの最後の選択です。

    NSOperationQueueには、キューに登録されている操作をキャンセルするパブリックメソッド(cancelAllOperations)が既に存在するため、特殊なケースが混乱しています。外部アクセスからキューを保護する場合(発信者がaddOperationを直接使用しないようにする場合)、キューを別のタイプ(つまりコンポジション)に入れて、必要なものをキューに転送する必要があります。あなたが解決している特定の問題の詳細については、他のSwiftのようなソリューションを提案するのに役立ちます。

    最後にprotectedまたはfriendのようなものが必要な場合は、正しい解決方法はprivateです。あなたのサブクラスまたはあなたの友人をターゲットと同じファイルに置き、秘密のものに印を付けてくださいprivate。あるいは、作業する必要があるものをフレームワークに入れ、属性internalをマークします。 Swift Blogは、なぜこれが意図的な選択であるかの良い説明を提供します。

    +0

    偉大な答え。ありがとう! – StackOverflower

    関連する問題