用具体实现替换基类C#

时间:2013-09-30 08:47:13

标签: c# asp.net entity-framework oop

我有以下抽象类和接口:

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'

我的concrecte实现的代码在

之下
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的每个类都有一个不同的表。

3 个答案:

答案 0 :(得分: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() }

答案 1 :(得分:7)

MagazineTypeTypedEntity并不重要。想象一下,您有另一个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>
{
    // ...
}

答案 2 :(得分:1)

要实现此目的,您必须添加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`

用法:

{{1}}