2012-07-13 8 views
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(非ジェネリック)インターフェースを宣言するための唯一の方法は、明示的であるので、?

+1

これはあなたの問題を解決していませんが、あなたはそれが ' BookBase作るために意味をなさない可能性があるとは思わない:iBookの、iBookのT:FormatBase'を?さもなければ、あなたの単純な例では、 'IBook'の代わりに' IBook 'を使うことはほとんどないでしょう。 –

+0

あなたは正しいです。私はコードを更新します。しかし、非総称抽象的な問題は依然として存在する。 – BlueChameleon

+0

"'IBook .GetFormat()は継承されたメンバー' IBook.GetFormat() 'を非表示にします。隠しを意図している場合は、newキーワードを使用してください。警告。これはおそらくどこかで設計の決定が悪いことが原因ですが、より多くの情報がなければ、より良い設計が何であるかは言うまでもありません。 –

答えて

4

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

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

パーフェクト!これはまさに私が探していたものです。 – BlueChameleon

+0

ハ!私たちは[even](http://stackoverflow.com/a/11472335/31158)now、cowboy ... –

+0

@Jordãoはトリガを解放します:) –

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(); 
} 

また、具体的なクラスde具体的なFormatBase上CIDE:あなたの代わりに抽象的なことを宣言する、明示的なインターフェイスの実装を書くことができないのはなぜ

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

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

' new'を使うのは正解であることはめったにありません。 – spender

+0

@spender、私はそれを行うより良い方法はありませんか? –

+0

@spender: 'new'を使うか名前を変更します... OPは同じ名前を望んでいるので、彼は' new'を使うか警告を受け取ります....私はあなたについては知らないが、私は知らない私が作った_intentional_決定について警告されているように... –

関連する問題