1

こんにちは、私は c# を初めて使用します。Microsoft からの以下の回答を見つけました。インターフェイスと抽象を使用するための推奨事項です。

コンポーネントの複数のバージョンを作成することが予想される場合は、抽象クラスを作成します。抽象クラスは、コンポーネントをバージョン管理するための単純で簡単な方法を提供します。基本クラスを更新することにより、すべての継承クラスが変更で自動的に更新されます。一方、インターフェイスは一度作成すると変更できません。新しいバージョンのインターフェイスが必要な場合は、まったく新しいインターフェイスを作成する必要があります。

コンポーネントの複数のバージョンを作成することを意味します。例を提供してさらに詳しく教えてください。

4

3 に答える 3

4

ある種の動作やプロパティを共有する同様のクラスを持つことは、基本クラスを使用する場合です。標準的な例の 1 つは形状です。次のようなことができます。

基本抽象クラス - FourSidedShape

  • 4 つの辺すべてを追加する GetPerimeter メソッドがあります。
  • 抽象的である GetArea メソッドを持っている (派生クラスで定義する必要がある)

派生クラス - 長方形

  • 無料で GetPerimeter メソッドを自動的に取得します
  • 長さ x 幅を使用して、GetArea メソッドを実装する必要があります

派生クラス - 平行四辺形

  • 無料で GetPerimeter メソッドを自動的に取得します
  • base x height を使用して、GetArea メソッドを実装する必要があります

派生クラスは、基本クラスの一部ではない独自の動作を追加することもできます。

注: 抽象クラスは、直接インスタンス化できないクラスです。派生クラスの 1 つを使用する必要があります。

于 2012-12-13T17:24:36.637 に答える
3

これらは実際には 2 つの質問のはずですが、両方に答えます。

最初に2 つ目: null 許容型の使用法は次のとおりです。

decimal? priceFromDb = datarow.Field<decimal?>("price");

この場合、10 進数値を保持する型を宣言していますが、null になる可能性があります。これは、この場合はデータベースからのものであり、基になるフィールドが null である可能性があるためです。null 許容型を宣言する適切な方法?は、型名の最後に the を使用することです。次に、問題の値を使用する場合は、次のようにします。

if (priceFromDb.HasValue)
{
    Console.WriteLine("The price is {0}.", priceFromDb.Value);
}

最初の質問: インターフェイスは C# で使用され、クラスまたは構造体が必要な重要な機能を確実に実装するようにします。通常、それらにはほんの一握りのメソッドしか含まれておらず、通常は 1 つまたは 2 つにすぎません。また、公開されたインターフェイスを作成すると、それは変更されないという考えがあります。一方、抽象クラスは、クラスに必要なメソッドを強制的に実装するだけでなく、それらに共通の機能を提供する機能を提供します。また、将来抽象クラスに変更を加える場合は、より一般的なものを追加する継承クラスは自動的に機能を取得します。抽象クラスを使用することは、重大な変更を加えるためのライセンスではありません。共通の機能をよりクリーンな関数のクラスに結合する方法にすぎません。

.Net Framework を見ると、ほとんどのインターフェイス ( IEquatableIDisposableIComparable ) は通常、構造全体ではなく、オブジェクトに動作を適用するために使用されていることがわかります。

例として、抽象クラス ビークルを考えてみましょう。

abstract class Vehicle
{
    public int NumWheels { get; set; }
    public string Name { get; set; }
    public abstract void Drive();
    public override string ToString()
    {
        return "I am a vehicle!";
    }
}

Vehicle から継承する car オブジェクトを作成できます。実装する必要がありますがDrive()、 と の 2 つのプロパティを無料で取得できNumWheelsますName。継承クラス car はToString()、必要に応じてオーバーロードすることも、そのままにしておくこともできます。

public class Car : Vehicle
{
    public override void Drive()
    {
        // your implementation here
    }

    public override string ToString()
    {
        return "I am a car!";
    }
}
于 2012-12-13T17:25:36.777 に答える
0

おそらく「抽象クラスとインターフェイスの違い」は、.Net の世界で最もよく聞かれる質問です。理論的に違いを説明し、続いてコード スニペットを説明します。

私によると、理論的には、抽象クラスとインターフェイスには基本的に 5 つの違いがあり、以下にリストされています。

  1. クラスは任意の数のインターフェイスを実装できますが、サブクラスは多くても 1 つの抽象クラスしか使用できません。

  2. 抽象クラスには非抽象メソッド (具象メソッド) を含めることができますが、インターフェイスの場合はすべてのメソッドを抽象にする必要があります。

  3. 抽象クラスは任意の変数を宣言または使用できますが、インターフェースはそうすることが許可されていません。したがって、次のコードはコンパイルされません:-

インターフェイス TestInterface

{

int x = 4;  // Filed Declaration in Interface 

void getMethod(); 

string getName(); 

}

抽象クラス TestAbstractClass

{

int i = 4; 
int k = 3; 
public abstract void getClassName(); 

}

次のようなコンパイル時エラーが生成されます:-

エラー 1 インターフェイスにフィールドを含めることはできません。

したがって、コードを適切にコンパイルするには、フィールド宣言を省略する必要があります。

インターフェイス TestInterface

{

void getMethod();
string getName();

}

抽象クラス TestAbstractClass

{

int i = 4; 
int k = 3; 
public abstract void getClassName(); 

}

インターフェイスにフィールド宣言がないため、上記のコードは適切にコンパイルされます。

4.抽象クラスはコンストラクタ宣言を持つことができますが、インターフェースはそうすることができません。

したがって、次のコードはコンパイルされません:-

インターフェイス TestInterface {

// Constructor Declaration 
public TestInterface() 
{ 
void getMethod(); 
string getName(); 
}

}

抽象クラス TestAbstractClass

{

public TestAbstractClass() 
{ 
int i = 4; 
int k = 3; 
public abstract void getClassName(); 
}

}

上記のコードは、次のようにコンパイル時エラーを生成します:-

エラー 1 インターフェイスにコンストラクターを含めることはできません

したがって、コードをコンパイルするには、インターフェースからコンストラクタ宣言を省略する必要があります。

次のコードは完全にコンパイルされます:-

インターフェイス TestInterface {

void getMethod(); 
string getName(); 

}

抽象クラス TestAbstractClass {

public TestAbstractClass() 
{ 
int i = 4; 
int k = 3; 
public abstract void getClassName(); 

}

}

5.抽象クラスは、そのすべてのメンバー宣言に対してすべてのアクセス修飾子を持つことができますが、インターフェイスでは、インターフェイスのすべてのメンバーが暗黙的にパブリックであるため、アクセス修飾子 (パブリックを含む) を宣言することはできません。

注: ここでは、インターフェイスについてではなく、インターフェイスのメンバーのアクセス指定子について話しています。

次のコードはそれをよりよく説明します:-

提供アクセス指定子を Public として指定することは完全に合法です (public のみが許可されていることに注意してください)。

パブリック インターフェイス TestInterface

{

void getMethod(); 
string getName(); 

}

上記のコードは完全にコンパイルされます。

インターフェイスのメンバーにアクセス指定子を与えることは許可されていません。

インターフェイス TestInterface

{

public void getMethod(); 
public string getName(); 

}

上記のコードは、次のようにコンパイル時エラーを生成します:-

エラー 1 修飾子 'public' はこのアイテムには無効です。

ただし、インターフェイスを宣言する最善の方法は、インターフェイスのアクセス指定子とインターフェイスのメンバーを避けることです。

インターフェイス テスト

{

void getMethod(); 
string getName(); 

}

于 2015-08-18T16:16:42.400 に答える