【发布时间】:2017-08-30 06:03:29
【问题描述】:
我有两个类——Expert 和 Farmer,它们都有一些共同的特征,因此实现了一个抽象类 User。 User 实现了一个接口 IUser。在我的应用程序中,最初填写了公共字段,但随后用户指出他们是否是专家/农民。
此时,我想将当前对象转换为 Expert 或 Farmer 以填充各个独特的字段。我目前的方法是声明IUser user = new Farmer();,然后尝试在适当的时间进行适当的转换:Farmer farmer = user as Farmer 或Expert expert = user as Expert。但是,转换为 Expert 总是失败,尽管它们都实现了相同的接口和抽象类。
- 为什么这个演员会失败?
- 使用继承巧妙地解决此问题的正确方法是什么?显然,可以创建在
User抽象类中定义的函数createUser()或createFarmer(),或者只是实例化一个User和一个Farmer并在两者中填充初始字段,在拆分时采用所需的任何实例,但这些都不是特别优雅。
专家定义:
public partial class Expert : User
{
public override Guid Id { get; set; }
[StringLength(200)]
public override string Name { get; set; }
[Key]
[StringLength(10)]
public override string phone { get; set; }
[StringLength(50)]
public override string state { get; set; }
[StringLength(50)]
public override string district { get; set; }
[StringLength(6)]
public override string PIN { get; set; }
public override double geolat { get; set; }
public override double geolong { get; set; }
public override int v { get; set; }
public override int h { get; set; }
public override string AzureImageURL { get; set; }
//IParty properties
public override string ServiceUrl { get; set; }
public override string ChannelId { get; set; }
public override string PartyChannelAccountId { get; set; }
public override string PartyChannelAccountName { get; set; }
public override string BotChannelAccountId { get; set; }
public override string BotChannelAccountName { get; set; }
public override string ConversationAccountId { get; set; }
public override string ConversationAccountName { get; set; }
//Expert specific properties
public double price { get; set; }
public int totalRating { get; set; }
public int numberOfRating { get; set; }
public string description { get; set; }
public string languages { get; set; }
double _sortIndex = double.Nan
}
农民的定义:
public partial class Farmer : User, IVisualizable
{
//User override fields
[Key]
public override Guid Id { get; set; }
[StringLength(200)]
public override string Name { get; set; }
[StringLength(10)]
public override string phone { get; set; }
[StringLength(50)]
public override string state { get; set; }
[StringLength(50)]
public override string district { get; set; }
[StringLength(6)]
public override string PIN { get; set; }
public override double geolat { get; set; }
public override double geolong { get; set; }
public override int v { get; set; }
public override int h { get; set; }
public override string AzureImageURL { get; set; }
//IParty properties
public override string ServiceUrl { get; set; }
public override string ChannelId { get; set; }
public override string PartyChannelAccountId { get; set; }
public override string PartyChannelAccountName { get; set; }
public override string BotChannelAccountId { get; set; }
public override string BotChannelAccountName { get; set; }
public override string ConversationAccountId { get; set; }
public override string ConversationAccountName { get; set; }
//Farmer specific properties
[StringLength(12)]
public string AadhaarNum { get; set; }
public int cropId { get; set; }
[StringLength(1)]
public string acreage { get; set; }
/// <summary>
/// Constructor calling base - sets Guid of farmer
/// </summary>
public Farmer() : base()
{
}
}
用户定义:
public abstract class User : IUser
{
public abstract Guid Id { get; set; }
public abstract string Name { get; set; }
public abstract string phone { get; set; }
public abstract string state { get; set; }
public abstract string district { get; set; }
public abstract string PIN { get; set; }
public abstract double geolat { get; set; }
public abstract double geolong { get; set; }
public abstract int v { get; set; }
public abstract int h { get; set; }
public abstract string AzureImageURL { get; set; }
public abstract string ServiceUrl { get; set; }
public abstract string ChannelId { get; set; }
public abstract string PartyChannelAccountId { get; set; }
public abstract string PartyChannelAccountName { get; set; }
public abstract string BotChannelAccountId { get; set; }
public abstract string BotChannelAccountName { get; set; }
public abstract string ConversationAccountId { get; set; }
public abstract string ConversationAccountName { get; set; }
/// <summary>
/// Creates a new User with a new Guid already set.
/// </summary>
public User()
{
Id = Guid.NewGuid();
}
}
IUser的定义:
public interface IUser : IParty
{
Guid Id { get; set; }
string Name { get; set; }
string state { get; set; }
string district { get; set; }
string PIN { get; set; }
double geolat { get; set; }
double geolong { get; set; }
int v { get; set; }
int h { get; set; }
string AzureImageURL { get; set; }
}
谢谢!
【问题讨论】:
-
请显示失败的具体代码和类定义。至于你的第二个问题,请多描述一下
-
添加类定义
标签: c# inheritance interface abstract-class downcast