2

私はC#プログラミングに不慣れで、それがアマチュアの質問であることを知っているので、私を笑わないでください!

私はこれらのインターフェースを宣言しました

class derived : iInterface3
{
    double[] d = new double[5];
    public override int MyProperty
    {
        get
        {
            return 5;
        }
        set
        {
            throw new Exception();
        }
    }
    int iProperty
    {
        get
        {
            return 5;
        }
    }
    double this[int x]
    {
        set
        {
            d[x] = value;
        }
    }
}
class derived2 : derived
{

}
interface iInterface
{
    int iProperty
    {
        get;
    }
    double this[int x]
    {
        set;
    }
}
interface iInterface2 : iInterface
{ }
interface iInterface3 : iInterface2
{ }

iInterfaceのすべてのメンバーを派生クラスに実装しても、このエラーが発生します。

'final_exam_1.派生'はインターフェイスメンバー'final_exam_1.iInterface.this[int]'を実装していません。'final_exam_1.duced.this [int]'はパブリックではないため、インターフェイスメンバーを実装できません。

この

「final_exam_1.duced」はインターフェースメンバー「final_exam_1.iInterface.iProperty」を実装していません。'final_exam_1.duced.iProperty'はパブリックではないため、インターフェイスメンバーを実装できません。

なぜ?

よろしくお願いします!

4

4 に答える 4

3

クラスから派生するすべてのメンバーにpublic アクセス修飾子を追加する必要があります。

デフォルトは、アクセス権は低くなります。

overrideまた、インターフェースを実装するときにオーバーライドするものがないため、を削除する必要があります。オーバーライドとは、オーバーライドする仮想メソッドがある場合です。

class derived : iInterface3
{
    double[] d = new double[5];

    public int MyProperty
    {
        get
        {
            return 5;
        }
        set
        {
            throw new Exception();
        }
    }

    public int iProperty
    {
        get
        {
            return 5;
        }
    }

    public double this[int x]
    {
        set
        {
            d[x] = value;
        }
    }
}

コードには他にも問題がありますが、それがコンパイルされない理由です。

于 2013-01-12T18:08:52.473 に答える
0

とインデクサーをiProperty公開するか、明示的なインターフェイス実装を使用します。明示的な実装の宣言は次のようになりますint iInterface3.iProperty

于 2013-01-12T18:09:37.697 に答える
0

オーバーライドするものがないため、overrideプロパティを設定することはできません。ベースにはint MyPropertyありません。int MyPropertyclass/interface

于 2013-01-12T18:11:01.810 に答える
0

ばかげた問題がたくさんあります

    public override int MyProperty
    {
        get
        {
            return 5;
        }
        set
        {
            throw new Exception();
        }
    }

すでに仮想メンバーを持っている基本クラス/抽象クラスではなく、インターフェースから実装しているため、オーバーライドは無意味です。

2番目の問題。

    int iProperty
    {
        get
        {
            return 5;
        }
    }

継承されたプロパティのタイプをprivateにすることはできません。

修正されたコード:

class derived : iInterface3
{
    readonly double[] d = new double[5];
    public int MyProperty
    {
        get
        {
            return 5;
        }
        set
        {
            throw new Exception();
        }
    }

    public int iProperty
    {
        get
        {
            return 5;
        }
    }

    public double this[int x]
    {
        set
        {
            d[x] = value;
        }
    }
}
class derived2 : derived
{

}
interface iInterface
{
    int iProperty
    {
        get;
    }
    double this[int x]
    {
        set;
    }
}
interface iInterface2 : iInterface
{ }
interface iInterface3 : iInterface2
{ }
于 2013-01-12T18:12:38.037 に答える