3

次の抽象クラスとインターフェースがあります。

public interface ITypedEntity{
    TypedEntity Type { get; set; }
}

public abstract class TypedEntity:INamedEntity{
    public abstract int Id{get;set;}
    public abstract string Name { get; set; }
}

しかし、ITypedEntity を実装し、TypedEntity の具体的な実装を持つクラスを作成しようとすると、次のエラーが発生します。

 Magazine does not implement interface member ITypedEntity.Type. Magazine.Type cannot implement 'ITypedEntity.Type' because it does not have the matching return type of 'TypedEntity'

私の具体的な実装のコードは以下のとおりです

public class Magazine:INamedEntity,ITypedEntity
{
    public int Id {get;set;}
    [MaxLength(250)]
    public string Name {get;set;}
    public MagazineType Type { get; set; }
}
public class MagazineType : TypedEntity
{
    override public int Id { get; set; }
    override public string Name { get; set; }
}

何が起こっているのか理解できたと思いますが、MagazineType は TypedEntity であるため、その理由はわかりません。

ありがとう。

更新 1 このクラスを EF CodeFirst で使用したいこと、および ITypedEntity を実装するクラスごとに異なるテーブルが必要であることを言及する必要があります。

4

3 に答える 3

7

MagazineType を TypedEntity に変更する必要があります

public class Magazine:INamedEntity,ITypedEntity
{
public int Id {get;set;}
[MaxLength(250)]
public string Name {get;set;}
public TypedEntity Type { get; set; }
}

ただし、マガジンのオブジェクトを作成すると、派生型をそれに割り当てることができます

var magazine = new Magazine { Type = new MagazineType() }
于 2013-09-30T08:52:32.970 に答える
7

MagazineTypeであることは問題ではありませんTypedEntityITypedEntity別の実装があると想像してくださいNewspaperType。ITypedEntity インターフェイスのコントラクトには、次のことができる必要があると記載されています。

ITypedEntity magazine = new Magazine();
magazine.Type = new NewspaperType();

Magazine.Typeただし、これは の他のサブタイプを受け入れないコードと矛盾しますITypedEntity。(ただし、プロパティにゲッターしかない場合、コードは有効になると思います。)

解決策はジェネリックを使用することです:

interface ITypedEntity<TType> where TType : TypedEntity
{
    TType Type { get; set; }
}

class Magazine : ITypedEntity<MagazineType>
{
    // ...
}
于 2013-09-30T08:53:30.267 に答える
1

これを実現するには、次のexplicit実装を追加する必要がありITypedEntity.Typeます。

public class Magazine:INamedEntity,ITypedEntity
{
    public int Id {get;set;}
    [MaxLength(250)]
    public string Name {get;set;}
    public MagazineType Type { get; set; }

    TypedEntity ITypedEntity.Type 
    {
        get
        {
            return this.Type;
        } 
        set 
        {
            this.Type = value as MagazineType; // or throw an exception if value
                                               // is not a MagazineType 
        }
    }
}

使用法:

Magazine mag = new Magazine();
mag.Type                 \\ points to `public MagazineType Type { get; set; }`
((ITypedEntity)mag).Type \\ point to `TypedEntity ITypedEntity.Type`
于 2013-09-30T08:56:08.463 に答える