C#学習ノート----継承(第4章)
4937 ワード
オブジェクト向けのプログラミングでは、継承とインタフェースの継承を実現する2つの異なる継承タイプがあります.
≪継承の実装|Perform Inheritance|emdw≫:タイプがベース・タイプに派生し、そのベース・タイプのすべてのメンバー・フィールドと関数を持つことを示します.
インタフェース継承:関数の署名のみが継承され、実装コードが継承されていないタイプを示します.
C#マルチインプリメンテーション継承はサポートされていません
C#クラスは別のクラスと任意の複数のインタフェースから派生することができる
ダミーメソッド
ベースクラス関数をvirtualと宣言すると、どの派生クラスでも関数を書き換えることができます.
属性をvirtualと宣言できます
C#派生関数が別の関数を書き換える場合、overrideキーワードを使用して明示的に宣言する必要があります
署名が同じメソッドがベースクラスと派生クラスで宣言されているが、virtualとoverrideとしてそれぞれ宣言されていない場合、派生クラスメソッドはベースクラスメソッドを非表示にします.
C#派生クラスでメソッドを呼び出すための特別な構文のベースクラスバージョン:base.()があります.
抽象クラスと抽象関数
C#クラスと関数をabstractとして宣言できます.
抽象クラスはインスタンス化できません.
抽象関数は直接実現できず,非抽象派生クラスで書き直さなければならない.抽象関数自体も仮想的です(virtualキーワードを指定する必要はありません)
クラスに抽象関数が含まれている場合は、クラスも抽象的であり、抽象的として宣言する必要があります.
シール類とシール方法
C#クラスとメソッドをsealedとして宣言できます
クラスについては、そのクラスを継承できないことを示します.メソッドについては、メソッドを書き換えることができないことを示します.
メソッドまたはプロパティでsealedキーワードを使用するには、ベースクラスから書き換えるメソッドまたはプロパティとして宣言する必要があります.
派生クラスの構造関数
コンストラクション関数の呼び出し順序は、まずSystem.Objectを呼び出し、コンパイラがインスタンス化するクラスに達するまで階層に従って上下に行います.
修飾子
publicの任意のコードは、このアイテムにアクセスできます.
protectedは派生タイプのみがこのアイテムにアクセスできます
internalは、それを含むプログラムセットでのみアクセスできます.
privateは、その属するタイプでのみアクセスできます.
protected internalは、そのプログラムセットと派生タイプを含むコードでのみアクセスできます.
newメンバーは、継承されたメンバーを同じ署名で非表示にします.
staticメンバーがクラスに作用しない具体的な例
virtualメンバーは派生クラスで書き換えることができます
abstract仮想メンバーはメンバーの署名を定義しますが、実装コードは提供されていません.
overrideメンバーは、継承された仮想メンバーまたは抽象メンバーを書き換えます.
sealedはクラスに対して、セルフシールクラスを継承できません.属性とメソッドの場合、メンバーは継承された仮想メンバーを書き換えますが、派生クラスのメンバーはメンバーを書き換えることはできません.この修飾子はoverrideと一緒に使用する必要があります.
externメンバーは外部で別の言語で実装される(静的[DllImport]メソッドのみ)
インタフェース
一般的に、インタフェースにはメソッド、プロパティ、インデックス、イベントの宣言のみが含まれます.
インタフェースにコンストラクション関数は使用できません
フィールドは使用できません
演算子を含むリロードも許可されていません
メンバーに関する修飾子の宣言は許可されていません
インタフェースメンバーは常に公開されており、仮想または静的として宣言できません.
インタフェースは互いに継承することができ、その方式またはクラスの継承方式は同じである.
≪継承の実装|Perform Inheritance|emdw≫:タイプがベース・タイプに派生し、そのベース・タイプのすべてのメンバー・フィールドと関数を持つことを示します.
インタフェース継承:関数の署名のみが継承され、実装コードが継承されていないタイプを示します.
C#マルチインプリメンテーション継承はサポートされていません
C#クラスは別のクラスと任意の複数のインタフェースから派生することができる
ダミーメソッド
ベースクラス関数をvirtualと宣言すると、どの派生クラスでも関数を書き換えることができます.
属性をvirtualと宣言できます
C#派生関数が別の関数を書き換える場合、overrideキーワードを使用して明示的に宣言する必要があります
class MyBaseClass
{
public virtual string VirtualMethod()
{
return "This Method is virtual and defined in MyBaseClass";
}
}
class MyDerivedClass:MyBaseClass
{
public override string VirtualMethod()
{
return "This method is an override defined in MyDerivedClass";
}
}
署名が同じメソッドがベースクラスと派生クラスで宣言されているが、virtualとoverrideとしてそれぞれ宣言されていない場合、派生クラスメソッドはベースクラスメソッドを非表示にします.
C#派生クラスでメソッドを呼び出すための特別な構文のベースクラスバージョン:base.
class CustomerAccount
{
public virtual decimal CalculatePrice()
{
//implementation
return 0.0 ;
}
}
class GoldAccount:CustomerAccount
{
public override decimal CalculatePrice()
{
return base,CalculatePrice() * 0.9M;
}
}
抽象クラスと抽象関数
C#クラスと関数をabstractとして宣言できます.
抽象クラスはインスタンス化できません.
抽象関数は直接実現できず,非抽象派生クラスで書き直さなければならない.抽象関数自体も仮想的です(virtualキーワードを指定する必要はありません)
クラスに抽象関数が含まれている場合は、クラスも抽象的であり、抽象的として宣言する必要があります.
シール類とシール方法
C#クラスとメソッドをsealedとして宣言できます
クラスについては、そのクラスを継承できないことを示します.メソッドについては、メソッドを書き換えることができないことを示します.
メソッドまたはプロパティでsealedキーワードを使用するには、ベースクラスから書き換えるメソッドまたはプロパティとして宣言する必要があります.
class MyClass:MyClassBase
{
public sealed override void FinalMethod()
{
//etc.
}
}
派生クラスの構造関数
コンストラクション関数の呼び出し順序は、まずSystem.Objectを呼び出し、コンパイラがインスタンス化するクラスに達するまで階層に従って上下に行います.
修飾子
publicの任意のコードは、このアイテムにアクセスできます.
protectedは派生タイプのみがこのアイテムにアクセスできます
internalは、それを含むプログラムセットでのみアクセスできます.
privateは、その属するタイプでのみアクセスできます.
protected internalは、そのプログラムセットと派生タイプを含むコードでのみアクセスできます.
newメンバーは、継承されたメンバーを同じ署名で非表示にします.
staticメンバーがクラスに作用しない具体的な例
virtualメンバーは派生クラスで書き換えることができます
abstract仮想メンバーはメンバーの署名を定義しますが、実装コードは提供されていません.
overrideメンバーは、継承された仮想メンバーまたは抽象メンバーを書き換えます.
sealedはクラスに対して、セルフシールクラスを継承できません.属性とメソッドの場合、メンバーは継承された仮想メンバーを書き換えますが、派生クラスのメンバーはメンバーを書き換えることはできません.この修飾子はoverrideと一緒に使用する必要があります.
externメンバーは外部で別の言語で実装される(静的[DllImport]メソッドのみ)
インタフェース
一般的に、インタフェースにはメソッド、プロパティ、インデックス、イベントの宣言のみが含まれます.
インタフェースにコンストラクション関数は使用できません
フィールドは使用できません
演算子を含むリロードも許可されていません
メンバーに関する修飾子の宣言は許可されていません
インタフェースメンバーは常に公開されており、仮想または静的として宣言できません.
インタフェースは互いに継承することができ、その方式またはクラスの継承方式は同じである.