12

C# で記述されたインターフェイスがあり、クラスによって既に実装されています。実装されている既存のクラスを変更せずに、インターフェイスでオプションとしてもう 1 つのプロパティを追加することはできますか?

例えば

public interface IShape
{
    int area { get; }
}

public class FindWindow : IShape
{
    public int area
    {
        get
        {
            return 10;
        }
    }
}

この FindWindow には既に書かれています。オプションのプロパティを1つ追加して、既存のクラスに実装しないことは可能ですか?

つまり、

public interface IShape
{
    int area { get; }
    //optional
    //string WindowName{get;}
}

public class FindWindow : IShape
{
    public int area
    {
        get
        {
            return 10;
        }
    }

    //WindowName i am not implementing here
}

public class FindWindowName : IShape
{
    public int area
    {
        get { return 20; }
    }

    public string WindowName
    {
        get { return "Stack Overflow"; }
    }
}
4

4 に答える 4

27

インターフェイスのオプション メンバーの概念はありません。

ここで必要なのは、2 つのインターフェースを定義することです。1 つには が含まれarea、もう 1 つには が含まれますWindowName。このようなもの:

public interface IShape
{
    int area { get; }
}

public interface IFindWindow: IShape
{
    string WindowName { get; }
}

次に、実装クラスは、 または のいずれかを実装することを選択できIShapeますIFindWindow

実行時に、オペレーターを使用して、手元のオブジェクトによって実装されているisかどうかを判断します。IFindWindow

IShape shape = ...;
if (shape is IFindWindow)
    ....

そして、より派生したインターフェイスを実際に使用するには、as演算子を使用します。

IShape shape = ...;
IFindWindow findWindow = shape as IFindWindow;
if (findWindow != null)
    string windowName = findWindow.WindowName;
于 2013-07-25T10:14:01.360 に答える
9

オプションを使用したいシェイプが代わりに派生する新しいインターフェイスを作成できます。

public interface IWindowedShape : IShape
{
    string WindowName{get;}
}

したがって、 が渡された場合は、 へIShapeのキャストを試行して、このオプション プロパティにアクセスIWindowedShapeできるようになります。

public void DoStuff(IShape shape)
{
   var windowed = shape as IWindowedShape;
   string windowName = null;
   if(windowed!=null)
   {
      windowName = windowed.WindowName;
   }
}
于 2013-07-25T10:13:50.390 に答える
6

いいえ、これは不可能です。インターフェイスから派生する場合は、そのすべてのメンバーを派生クラスで定義する必要があります。

あなたが望むものを達成するために、Abstractクラスの使用について考えるかもしれません。

ユースケースの例:

public abstract class Base {
    public abstract Name {get;set;} // MUST DEFINE IN DERIVED CLASS, LIKE INTERFACE

    public string Surname {get;set;} // JUST A SIMPLE PROPERTY OF A BASE CLASS
}

一方、デスティックの分離が必要な場合はinterfaces、異なる ptoperties を使用して複数の を定義し、必要に応じて適切なインターフェイスから派生させます。

于 2013-07-25T10:14:06.563 に答える