web-dev-qa-db-ja.com

インターフェイスをインスタンス化するときにエラーが発生するのはなぜですか?

クラスとインターフェイスがあり、インターフェイスをインスタンス化しようとするとエラーが発生します。

抽象クラスまたはインターフェイスのインスタンスを作成できません

私のコードは次のとおりです。

_namespace MyNamespace
{
    public interface IUser
    {
        int Property1 { get; set; }
        string Property2 { get; set; }
        string Property3 { get; set; }
        void GetUser();
    }

    public class User : IUser
    {
        public int Property1 { get; set; }
        public string Property2 { get; set; }
        public string Property3 { get; set; }

        public void GetUser()
        {
           //some logic here...... 
        }

    }
}
_

IUser user = new IUser();をインスタンス化しようとすると、エラーが発生します。

抽象クラスまたはインターフェイスのインスタンスを作成できません

ここで何が間違っていますか?

41
Alex

エラーメッセージは一目瞭然のようです。インターフェイスのインスタンスをインスタンス化することはできず、IUserをインターフェイスとして宣言しました。 (同じ規則が抽象クラスにも適用されます。)インターフェースの全体的なポイントは、do何もしないということです。メソッドには実装がありません。

ただし、canクラスのインスタンスをインスタンス化するimplementsそのインターフェイス(メソッドの実装を提供)、あなたの場合はUserクラス。

したがって、コードは次のようにする必要があります。

IUser user = new User();

これは、Userクラス(実装を提供する)のインスタンスをインスタンス化し、それをインターフェイスタイプのオブジェクト変数に割り当てます(IUser、インターフェイスを提供し、プログラマはオブジェクトと対話できます)。

もちろん、次のように書くこともできます。

User user = new User();

Userクラスのインスタンスを作成し、それを同じ型のオブジェクト変数に割り当てますが、そもそも別のインターフェイスを定義するという目的を無効にします。

46
Cody Gray

店に行って、電源スイッチのあるデバイスを要求したと想像してください。コピー機、テレビ、掃除機、電気スタンド、ワッフルメーカーなどが必要かどうかは言いませんでした。電源スイッチ付きのデバイスを要求しました。店員が「電源スイッチのあるデバイス」としか言いようのないものを提供してくれると思いますか?

典型的なインターフェイスは、「電源スイッチのあるデバイス」の説明に似ています。機器が「電源スイッチを備えたデバイス」であることを知っていると、それを使用して何らかの操作(つまり、電源のオン/オフ)ができるようになります。 「1日の終わりに電源を切る必要がある電源スイッチを備えたデバイス」。電源スイッチ以外の特性を共有する必要はありませんが、このような状況は通常、作成されたデバイスに一般的な操作を適用する場合にのみ適用されますより具体的な目的のため。ゼロから何かを作成する場合、ランダムな「電源スイッチを備えたデバイス」よりも、「コピー機」、「テレビ」、「掃除機」、または他の特定のタイプのデバイスを使用する可能性が高くなります。

あいまいに定義されたオブジェクトが必要な場合がありますが、実際にそれが何であるかを本当に気にしない場合があります。 「水を沸かすことができる最も安い装置をください」。誰かが「水沸騰」能力を持つ任意のオブジェクトを要求したときに、Acme 359 Electric Teakettleを提供するように指定できれば、それは素晴らしいことです。実際にクラスを使用する場合は、それを行うことができます。ただし、「水を沸かす装置」を求める人には「水を沸かす装置」ではなく、「Acme 359 Electric Teakettle」が与えられることに注意してください。

36
supercat

IUserはインターフェイスです。インターフェイスをインスタンス化することはできません。

インターフェイスを実装する具象クラスをインスタンス化する必要があります。

IUser user = new User();

または

User user = new User();
15
ChrisBint

インターフェイスまたは抽象クラスをインスタンス化することはできません。

それは、それに対するロジックを持たないからです。

インターフェースクラスにあるべきメソッドのcontractを実装せずに提供します。 (したがって、インターフェースには実際のロジックはありません)。

抽象クラ​​スクラスの基本的なロジックを提供しますが、完全に機能するわけではありません(すべてが実装されているわけではありません)。繰り返しますが、あなたはそれで何もできなくなります。

5
Yochai Timmer

抽象クラスまたはインターフェースをインスタンス化することはできません。抽象クラスの場合は継承する必要があり、インターフェイスの場合は実装する必要があります。例えば.

...
private class User : IUser
{
  ...
}

User u = new User();
2
George Johnston

それはそれが言うことです、あなたはただ抽象クラスをインスタンス化することができません。最初に実装してから、そのクラスをインスタンス化する必要があります。

IUser user = new User();
0
Erkan Haspulat