問題タブ [protected]
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# 内部抽象クラス、使用法を外部に隠す方法に似ていますが、私の動機は異なります。これがシナリオです
私は次のことから始めました:
上記は正常にコンパイルされます。しかし、基本クラスを抽出する必要があると判断し、次のように記述しようとしました。
したがって、問題は、保護されたメンバーがアセンブリの外部に表示されますが、内部型であるため、コンパイルされません。
当面の問題は、PublicBaseClass と同じアセンブリ内のパブリック クラスのみがそれを継承する可能性があるため、_fieldA がアセンブリの外部に公開されないことをコンパイラに伝える方法 (またはできるか?) です。
または、私がやりたいことを行う別の方法はありますか、すべて同じアセンブリにあり、共通の (「保護された」) コードでそのアセンブリの内部型を使用するパブリック スーパー クラスと一連のパブリック基本クラスがありますか?
私がこれまでに持っていた唯一のアイデアは次のとおりです。
しかし、それは醜いです!
c++ - C++ の基本クラスの保護フィールドに関する問題
BassClass
たとえば、いくつかのフィールドを保護した基本クラスと、いくつかの純粋な仮想関数があります。次に、派生クラス、たとえばDerivedClass
、のようにclass DerivedClass : public BassClass
。DerivedClass は BassClass から保護されたフィールドを継承するべきではありませんか? DerivedClass をコンパイルしようとすると、コンパイラは DerivedClass にこれらのフィールドがないと不平を言います。何が問題なのですか? ありがとう
c# - 基本クラス変数を介してアクセスされるC#で保護されたメンバー
初心者の質問のように思われるかもしれませんが、メソッドDer.B()がBaseクラス変数を介して保護されたFooにアクセスできない理由を説明できますか?これは私には奇妙に見えます:
ありがとう!
c# - 基本/兄弟クラスを介した保護されたメンバーへのアクセスを防止する本当の理由は何ですか?
最近、派生クラスのメソッドは、派生クラス (またはそのサブクラスの 1 つ) のインスタンスを介してのみ、基本クラスの保護されたインスタンス メンバーにアクセスできることを発見しました。
Base のメソッドは Base.Member にアクセスでき、MyDerived はその静的メソッドを呼び出すことができるため、基本クラスに静的メソッドを追加することで、この制限を回避することができました。
ただし、この制限の理由はまだわかりません。いくつかの異なる説明を見てきましたが、MyDerived.Test() がまだ MySuperDerived.Member にアクセスできる理由を説明できていません。
原則的な説明: 「保護」とは、そのクラスとそのサブクラスのみがアクセスできることを意味します。YourDerivedはMember() をオーバーライドして、YourDerived とそのサブクラスのみがアクセスできる新しいメソッドを作成できます。MyDerived は、オーバーライドされた yd.Member() を呼び出すことができません。これは、YourDerived のサブクラスではないためです。また、b が実際には YourDerived のインスタンスである可能性があるため、b.Member() を呼び出すこともできません。
では、なぜ MyDerived は msd.Member() を呼び出せるのでしょうか? MySuperDerived は Member() をオーバーライドできますが、そのオーバーライドは MySuperDerived とそのサブクラスのみがアクセスできるはずですよね?
オーバーライドされたメンバーを呼び出しているかどうかは、実行時までわかりません。また、メンバーがフィールドの場合、オーバーライドすることはできませんが、アクセスは引き続き禁止されています。
実用的な説明:他のクラスは、クラスが知らない不変条件を追加する可能性があり、それらの不変条件を維持できるように、公開インターフェイスを使用する必要があります。MyDerived が YourDerived の保護されたメンバーに直接アクセスできる場合、それらの不変条件が壊れる可能性があります。
私の同じ反論がここに当てはまります。MyDerived は、MySuperDerived が追加する可能性のある不変条件も知りません。別の作成者によって別のアセンブリで定義される可能性があります。では、なぜ MyDerived はその保護されたメンバーに直接アクセスできるのでしょうか?
このコンパイル時の制限は、実際には実行時にしか解決できない問題を解決しようとする誤った試みとして存在するという印象を受けます。しかし、多分私は何かを見逃しています。MyDerived がタイプ YourDerived または Base の変数を介して Base の保護されたメンバーにアクセスできるようにすることによって引き起こされる問題の例はありますが、タイプ MyDerived または MySuperDerived の変数を介してそれらにアクセスする場合にはまだ存在しませんか?
--
更新: コンパイラが言語仕様に従っていることはわかっています。私が知りたいのは、仕様のその部分の目的です。理想的な答えは、「MyDerived が YourDerived.Member() を呼び出すことができれば、$NIGHTMARE が発生しますが、MySuperDerived.Member() を呼び出すと、$ITSALLGOOD のため発生しません。」
actionscript-3 - AS3:サブクラスの保護された変数をオーバーライドする
ここで停電が発生しています。私はこれらの原則を理解したと思いましたが、もうそれを機能させることができないようです。DeleteButtonに一般的なButtonクラスから継承させたい。このDeleteButtonは、保護されたパディング値を変更し、静的ラベルを付ける必要があります。これは私が持っているものです:
さて、継承されたクラスで変更された_paddingXと_paddingYの値は、スーパークラスにバブルアップすると思いました。しかし、そうではありません。DeleteButtonは、引き続きスーパークラスのデフォルト値で作成されます。もうどうしたらいいのかわからない。ここで何が欠けていますか?
前もって感謝します。
編集:
AS3の実装とPHPの実装を混同していたと思います。PHPのこの「同等の」例は完全に合法です。
c# - C# は、アセンブリ内のすべての型にアクセス可能なアクセサーを設定し、派生型に対してのみアクセサーを取得します。方法?
アクセス修飾子のない型のこのプロパティ(つまり、internal
アクセス):
SomeType のアセンブリ内のすべての型とアクセサーを使用できるようget
にしset
ます。問題: アクセスをSomeType (および実際の SomeType) から派生した型のみに制限するにはどうすればset
よいですか?
はコンパイラによって拒否されます。これは、protected
よりも制限が緩いと言われているためですinternal
(おそらく:protected
との交差がありますが、完全に含まれてinternal
いるわけではありません--> 派生型は の範囲を超えて存在できます)。internal
internal
アセンブリ内の任意の型からアクセスされ、アセンブリ内の派生型によってのみ設定されるコードは何でしょうか?
編集: 回答を確認した後、解決策に違いが生じる可能性があるため、プロパティの別の特性を追加する必要があると思います: プロパティのタイプは実際にはSomeType
です。編集されたコードは次のとおりです。
プロパティが宣言されている場合public
、コンパイラはエラーを発行します (プロパティ タイプ SomeType は、プロパティ Length よりもアクセスしにくくなります)。
java - 保護されたメンバーをJavaで公開できますか? サブクラスからアクセスしたい
私は Java と OOP の初心者です。
クラス A でプライベート サブクラス (実際には構造体) B を使用していましたが、サブクラス B の親クラス C を作成することを決定するまで、すべてがうまくいきました。クラス C の保護されたメンバーの一部を公開したいと考えています。
例えば:
そして、私は得る
暗黙のスーパー コンストラクター C() は、既定のコンストラクターに対して未定義です。明示的なコンストラクターを定義する必要があります
もちろん、extend C を削除して、以前の状態に戻すこともできます。または、ゲッター/セッターを作成することもできます。しかし、内部構造体が受け入れられ、他のクラスを拡張できるはずであることは理解できると思います。
c# - 抽象クラスと、保護されたコンストラクターのみを持つクラスの違いは何ですか?(。ネット)
抽象クラスと、保護されたコンストラクターのみを持つクラスのすべての違いは何ですか?どちらもインスタンス化できないという点で、私とよく似ているようです。
編集:
保護されたコンストラクターを持つ基本クラスを使用して、派生クラスにインスタンスをどのように作成しますか?例えば:
java - 保護されたメソッドの問題を理解するのに役立ちます
2005年4月のSybexCompleteJava 2認定研究ガイド(ISBN0782144195)を読んでいます。この本は、Java認定に合格したいJava開発者を対象としています。
アクセス修飾子(および他の修飾子)に関する章の後で、次の質問(#17)を見つけました:
正誤問題:クラスYがクラスXを拡張し、2つのクラスが異なるパッケージにあり、クラスXにabby()という保護されたメソッドがある場合、Yの任意のインスタンスがYの他のインスタンスのabby()メソッドを呼び出すことができる。
この質問は私を少し混乱させました。
私の知る限り、同じクラス(またはサブクラス)の任意の変数で保護されたメソッドを呼び出すことができます。階層の上位にある変数(実装するインターフェースなど)で呼び出すことはできません。
たとえば、オブジェクトを継承したからといって、オブジェクトのクローンを作成することはできません。
しかし、質問は変数型については何も述べておらず、インスタンス型についてのみ述べています。
少し戸惑い、「本当」と答えました。
本の答えは
誤り。別のパッケージのスーパークラスから保護されたメソッドを継承するオブジェクトは、それ自体でそのメソッドを呼び出すことができますが、同じクラスの他のインスタンスでは呼び出すことはできません。
ここでは、変数タイプについては何もありません。インスタンスタイプについてのみです。
これは非常に奇妙です、私はそれを理解していません。
誰かがここで何が起こっているのか説明できますか?
java - JavaのAbstractListのremoveRange()メソッドが保護されているのはなぜですか?
誰かが何か考えを持っていますか、 AbstractList(およびArrayList)のremoveRangeメソッドがなぜですか?非常に明確で便利な操作のように見えますが、それでも、それを使用するには、List実装をサブクラス化する必要があります。protected
隠された論理的根拠はありますか?私にはまったく説明できないようです。