9

ジェネリック インターフェイスを宣言した後で、このインターフェイスの非ジェネリック バージョン、または少なくともそのインターフェイスの一部のメソッドまたはプロパティの非ジェネリック バージョンが必要になる状況によく遭遇します。通常、新しい非ジェネリック インターフェイスを宣言し、ジェネリック インターフェイスを継承させます。私が直面している問題は、以下の例に示されています。

public abstract class FormatBase { }

public interface IBook<F> where F : FormatBase
{
    F GetFormat();
}

public interface IBook
{
    object GetFormat();
}

public abstract class BookBase : IBook<FormatBase>, IBook
{
    public abstract FormatBase GetFormat();

    object IBook.GetFormat()
    {
        return GetFormat();
    }
}

IBook (非ジェネリック) インターフェイスを宣言する唯一の方法は明示的であるため、どうやって抽象化しますか?

4

2 に答える 2

7

委任するだけです:

public abstract class BookBase : IBook<FormatBase> {
  public abstract FormatBase GetFormat();

  object IBook.GetFormat() {
    return GetFormat();
  }
}

または、両方のメソッドを区別したい場合は、新しいメソッドに委任します。

public abstract class BookBase : IBook<FormatBase> {
  public abstract FormatBase GetFormat();

  public abstract object IBook_GetFormat();

  object IBook.GetFormat() {
    return IBook_GetFormat();
  }
}

newまた、「継承されたメンバーを非表示にしています」という警告をかわす必要があります。

public interface IBook<F> : IBook 
where F : FormatBase {
  new F GetFormat();
}

また、具体的なクラスに具体的な決定をさせる方が理にかなっているかもしれませんFormatBase:

public abstract class BookBase<F> : IBook<F> 
where F : FormatBase {
  public abstract F GetFormat();

  object IBook.GetFormat() {
    return GetFormat();
  }
}
于 2012-07-13T15:07:57.067 に答える
4

抽象化を宣言する代わりに、明示的なインターフェイスの実装を記述できないのはなぜですか?

public abstract class BookBase : IBook<FormatBase>, IBook
{                
    public abstract FormatBase GetFormat();

    object IBook.GetFormat()
    {
        return GetFormat();
    }
}
于 2012-07-13T15:15:54.367 に答える