2011-02-12 5 views
6

明確にするために、子クラスのすべてのメンバーがその上の抽象クラスで宣言されていることは、本当に必須ですか? 抽象親クラスでメンバーを定義せずに子クラスにメンバーを定義することはできますか? C#

は、このような可能なものになるだろう:

public abstract class MyParent 
{ 
    public int x { get; set; } 
} 
public class MyChild : MyParent 
{ 
    public int x { get; set; } 
    public string MyName { get; private set; } 
} 

これは一例です...このような場合には、プロパティMyNameは、親クラスで定義されていないが、それは子クラスであります...出来ますか?

ありがとうございます!

答えて

4

はい、子クラスで追加のプロパティとメソッドを宣言できます。

ただし、祖先型として宣言されている変数を使用している場合は、その変数を通じて祖先型で定義されたメンバーにのみアクセスできます。子クラスの特別なものに到達する唯一の方法は、子タイプに型キャストすることです。

脇に:子クラスはでなく、は祖先で行われた宣言を複製する必要があります。あなたのint xプロパティは問題を引き起こします。なぜなら2つの異なるxプロパティが動いているからです。

具体的な(非抽象)子クラスはオーバーライド抽象祖先で宣言された任意の仮想のメソッドやプロパティに必要とされます。仮想とオーバーライドの両方には、宣言に特定のキーワードが必要です。

2

はい親クラスにない新しいメンバーを子クラスに作成することは可能です。それは子供のクラスを持つ全ポイントです。子クラスは、新しいメンバーを追加したり、既存のメンバーの動作を変更することによって、親クラスを「拡張」することになっています。

ただし、子クラスの親クラスメンバーを再作成する必要はありません。子クラスはすべてのメンバーを親クラスから自動的に取得します。

あなたが指定したコードは、有効なC#プログラムです。つまり、あなたの意図は、子クラスのために別のint xを作成することです。これはしばしばケースではなく、Microsoft C#コンパイラは警告を出します。

+0

この回答に混乱しています。 – spender

+1

@spender。今すぐやってみて下さい – Midhat

2

もちろん、これはあなたが行うことは非常に正常です。ただし、親を通過する場合はMyNameプロパティにアクセスするだけではできません。その場合、MyParentに共通するものにアクセスするだけです。