-1

.net の継承に関するこの基本的なルールに遭遇しました:
CS0060: クラス型の直接の基本クラスは、少なくともクラス型自体と同じくらいアクセス可能である必要があります。

なぜこのルールが開発されたのか興味があります。

この種の継承が好まれる理由を知っている人はいますか? 異なる方法で行う言語はありますか。


    // CS0060.cs
class MyClass
// try the following line instead
// public class MyClass
{
}

public class MyClass2 : MyClass   // CS0060
{
   public static void Main()
   {
   }
}

ありがとう

4

5 に答える 5

3
class BaseClass {...}
public class MyClass: BaseClass {...} // Error

http://msdn.microsoft.com/en-us/library/cx03xt0t.aspx

これはC#言語仕様で言及されており、これは完全に理にかなっています。なぜなら、あなたの場合、パブリッククラスは、基本クラスである非パブリッククラスのアクセスを許可するパブリックアクセシビリティレベルの「パブリック」コンテキストで使用でき、これは間違った行動になります。

C# 言語仕様 5.0 によると:

( http://www.microsoft.com/en-us/download/details.aspx?id=7029から仕様をダウンロードしてください)

次のアクセシビリティ制約が存在します。

クラス型の直接の基本クラスは、少なくともクラス型自体と同じくらいアクセス可能である必要があります

• インターフェイス タイプの明示的な基本インターフェイスは、少なくともインターフェイス タイプ自体と同じくらいアクセス可能である必要があります。

• デリゲート型の戻り値の型とパラメーターの型は、少なくともデリゲート型自体と同じくらいアクセス可能である必要があります。

• 定数の型は、少なくとも定数自体と同じくらいアクセス可能でなければなりません。

• フィールドのタイプは、少なくともフィールド自体と同じくらいアクセス可能である必要があります。

• メソッドの戻り値の型とパラメーターの型は、少なくともメソッド自体と同じくらいアクセス可能である必要があります。

• プロパティのタイプは、少なくともプロパティ自体と同じくらいアクセス可能である必要があります。

• イベントのタイプは、少なくともイベント自体と同じくらいアクセス可能である必要があります。

• インデクサーの型とパラメーターの型は、少なくともインデクサー自体と同じくらいアクセス可能である必要があります。

• 演算子の戻り値の型とパラメータの型は、少なくとも演算子自体と同じくらいアクセス可能でなければなりません。

• インスタンス コンストラクターのパラメーターの型は、少なくともインスタンス コンストラクター自体と同じくらいアクセス可能である必要があります。

于 2013-12-31T14:48:37.053 に答える
1

後続のすべてのクラスには、例の MyClass2 と少なくとも同じアクセシビリティが必要です。

これは論理的であるため、次の例になります。

Prop というパブリック プロパティを持つ内部クラス A があるとします。基本クラスもパブリックでない場合、派生したパブリック クラス B にプロパティ Prop があることを外の世界はどのように知るのでしょうか?

于 2013-12-31T14:51:47.727 に答える
0

@mohammed sameeh、あなたの主張はわかります。これの価値は何ですか?または、これを許可しようとした場合、.net が異なる動作をした場合の副作用は何でしょうか?

@Anirudhは、その基本クラスのセキュリティについて話したときに、それに到達していました。

この制限がなければ、一貫して「プライベート」/「内部」のものを隠すというセキュリティ モデルが壊れる可能性があります。そうでなければ、非常に混乱します!
これは、プロパティとメソッドを誤って公開する、最大の潜在的な副作用です。

定義により、子クラスは親のプロパティとメソッドを継承するため、この場合、それらをどのように考慮する必要がありますか?
プロパティとメソッドが継承とサブクラス化でどのように公開されるかについて (さらに多くの) ルールを持つのではなく、.net は公開の階層を維持し、それを強制することで物事を簡素化します。

制限なしで型キャストなどに何が起こるかについて、他の誰かがクールな点を指摘するかもしれません。

確かに、他のルールが存在する可能性があります。それを別の言語で行うのは興味深いかもしれません。

しかし、確かにある種の規則が必要なので、他の誰かがあなたのクラスまたはアセンブリを消費したときに、何を期待すべきかがわかります。

于 2013-12-31T15:14:47.920 に答える