我有以下抽象类和接口:
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的每个类都有一个不同的表。
答案 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)
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>
{
// ...
}
答案 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}}