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

但是当您创建 Magazine 的对象时,您可以为其分配派生类型

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

没关系,那MagazineType是一个TypedEntity. 假设您有另一个ITypedEntity实现,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 回答