接口定义为了全局变量,如何将该变量用实现了该接口的派生类实例化

叮咚叮咚叮叮咚 2012-04-19 03:34:42
遇到个问题,请教兄弟们帮忙解决下:

具体场景如下:
订单包含销售订单与采购订单,我想两种订单在列表等操作时公用同一个窗体,在窗体类中定义一个接口类型的全局变量dal,然后在form_load的时候实例化并返回列表等。

Model部分建立了订单的抽象类OrderInfo

public abstract class OrderInfo
{
public int ID { get; private set; }

/// <summary>
/// 订单号
/// </summary>
public string OrderNo { get; set; }

/// <summary>
/// 订单日期
/// </summary>
public DateTime? OrderDate { get; set; }

/// <summary>
/// 部门编码
/// </summary>
public string DepCode { get; set; }


/// <summary>
/// 存货编码
/// </summary>
public string InvCode { get; set; }
}

SalesOrderInfo和PurchaseOrderInfo继承OrderInfo抽象类

订单的DAL接口IOrder,声明如下:


public interface IOrder<T> where T : Model.OrderInfo
{
List<T> List();
List<T> List(string sqlWhere);
}


DAL部分销售订单及采购订单的实现类
public class SalesOrder : IOrder<SalesOrderInfo>
{
.........
}
public class PurchaseOrder : IOrder<PurchaseOrderInfo>
{
......
}

窗体中定义了接口的全局变量
public partial class FrmOrder : Form
{
IOrder<OrderInfo> dal;
private void FrmOrder_Load(object sender, EventArgs e)
{
switch (this.orderType)
{
case OrderType.PurchaseOrder:
dal= = new PurchaseOrder();
break;
case OrderType.SalesOrder:
dal= = new SalesOrder();
break;
}
dal.List();
}
}

现在这样运行出错提示为 “无法将类型“DAL.SalesOrder”隐式转换为“IDAL.IOrder<Model.OrderInfo>”。存在一个显式转换(是否缺少强制转换?)”

请教如何解决?
...全文
274 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
anzhiqiang_touzi 2012-04-19
  • 打赏
  • 举报
回复
public interface IOrder<out T> where T : OrderInfo
{
IEnumerable<T> List();
IEnumerable<T> List(string sqlWhere);
}
WAN 2012-04-19
  • 打赏
  • 举报
回复
使用协变自然有它的意义和作用,虽然不一定说会用上。如果说能解决问题就可以了,干脆直接也就不要用泛型了
qldsrx 2012-04-19
  • 打赏
  • 举报
回复
不要动不动就协变,可以直接解决的问题,变什么变啊。
如下写你的继承类即可:
public class SalesOrder : IOrder<OrderInfo>
{
.........
}
public class PurchaseOrder : IOrder<OrderInfo>
{
......
}
WAN 2012-04-19
  • 打赏
  • 举报
回复
需要使用协变:
        public interface IOrder<out T> where T : OrderInfo
{
IEnumerable<T> List();
IEnumerable<T> List(string sqlWhere);
}
PaulyJiang 2012-04-19
  • 打赏
  • 举报
回复
SalesOrder : IOrder<SalesOrderInfo>

PurchaseOrder : IOrder<PurchaseOrderInfo>

怎么能转换呢?

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧