请问一个继承类的判断有关问题
请教一个继承类的判断问题。
我有一个类,类名是Model.Sale.Sale_Order,它继承自IModelMaster接口,
然后我在某个方法中判断
businessMasterBase is IBusiness.IBusinessMaster<Model.Sale.Sale_Order>为true,
但businessMasterBase is IBusiness.IBusinessMaster<IModelMaster>为false
我一直认为businessMasterBase is IBusiness.IBusinessMaster<IModelMaster>应该是为true的,求解释。。
------解决思路----------------------
is就是处于对类型的判断。返回true和false。
如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false。
另外is操作符永远不会抛出异常。
System.Boolean b1 = (o is System.Object),返会true
派生类继承基类,我们可以说派生类是基类,反过来就是假命题
abstract class Animal{}
class Dog:Animal
{}
class Cat:Animal
{}
我们可以讲狗是动物(Dog is Animal),反过来你能说“动物是狗吗?”
is的用法就是这个道理
------解决思路----------------------
IBusinessMaster<T> 不同T就已经是不同类型了。
------解决思路----------------------
泛型参数有继承性,不意味着泛型就有继承性,实际上二者没有关系。
------解决思路----------------------
IBusinessMaster<T>中T应当为协变才能使
当有businessMasterBase is IBusiness.IBusinessMaster<Model.Sale.Sale_Order>为true
同时businessMasterBase is IBusiness.IBusinessMaster<IModelMaster>为true
声明为:IBusinessMaster<out T>,但此时对于IBusinessMaster<T>接口成员有限制,具体参考MSDN:
out(泛型修饰符)(C# 参考)
in(泛型修饰符)(C# 参考)
------解决思路----------------------
------解决思路----------------------
你的问题和这里http://bbs.****.net/topics/390909392是一样的,可以先看下我那篇里面7楼的回答。
设计泛型继承的时候经常有这种问题,你这个有两种解决办法,第一种是让IService这条线也使用泛型:
第二种方法是把AService里需要的方法抽到非泛型的接口上:
我有一个类,类名是Model.Sale.Sale_Order,它继承自IModelMaster接口,
然后我在某个方法中判断
businessMasterBase is IBusiness.IBusinessMaster<Model.Sale.Sale_Order>为true,
但businessMasterBase is IBusiness.IBusinessMaster<IModelMaster>为false
我一直认为businessMasterBase is IBusiness.IBusinessMaster<IModelMaster>应该是为true的,求解释。。
------解决思路----------------------
is就是处于对类型的判断。返回true和false。
如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false。
另外is操作符永远不会抛出异常。
System.Boolean b1 = (o is System.Object),返会true
派生类继承基类,我们可以说派生类是基类,反过来就是假命题
abstract class Animal{}
class Dog:Animal
{}
class Cat:Animal
{}
我们可以讲狗是动物(Dog is Animal),反过来你能说“动物是狗吗?”
is的用法就是这个道理
------解决思路----------------------
IBusinessMaster<T> 不同T就已经是不同类型了。
------解决思路----------------------
泛型参数有继承性,不意味着泛型就有继承性,实际上二者没有关系。
------解决思路----------------------
IBusinessMaster<T>中T应当为协变才能使
当有businessMasterBase is IBusiness.IBusinessMaster<Model.Sale.Sale_Order>为true
同时businessMasterBase is IBusiness.IBusinessMaster<IModelMaster>为true
声明为:IBusinessMaster<out T>,但此时对于IBusinessMaster<T>接口成员有限制,具体参考MSDN:
out(泛型修饰符)(C# 参考)
in(泛型修饰符)(C# 参考)
------解决思路----------------------
public class B
{
}
public class D:B
{
}
public interface I<out T>
{
}
public class Z<T>:I<T>
{
}
Z<D> a = new Z<D>();
I<B> b = a;
if (a is I<B>)
{
}
------解决思路----------------------
你的问题和这里http://bbs.****.net/topics/390909392是一样的,可以先看下我那篇里面7楼的回答。
设计泛型继承的时候经常有这种问题,你这个有两种解决办法,第一种是让IService这条线也使用泛型:
// 添加泛型IService
public interface IService<T> : IService where T : IModelMaster
{
new T GetMaster(string primary);
}
// 抽象基类AService改为泛型实现
public abstract class AService<T> : IService<T> where T: IModelMaster
{
private IBusinessMaster<T> businessMasterBase; // 泛型business master
public AService(IBusinessMaster<T> businessMasterBase)
{
this.businessMasterBase = businessMasterBase;
}
public virtual T GetMaster(string primary)
{
return businessMasterBase.GetModel(primary);
}
IModelMaster IService.GetMaster(string primary)
{
return GetMaster(primary);
}
}
// 后面具体实现使用泛型基类
public class Sale_Order : AService<BLL.Sale.Sale_Order>
{
}
第二种方法是把AService里需要的方法抽到非泛型的接口上:
public interface IBusinessMasterBase : IBusinessBase
{
// 把下一级泛型接口上需要用到的GetModel方法抽到非泛型接口上来
IModelMaster GetModel(string primaryKeyValue);
}
public interface IBusinessMaster<T> : IBusinessMasterBase where T : IModelMaster
{
// 这里原型和上面一样,所以加个new
new T GetModel(string primaryKeyValue);
}
// 添加一个抽象基类辅助显式实现非泛型接口
public abstract class BusinessMasterBase<T> : IBusinessMaster<T> where T : IModelMaster
{
public abstract T GetModel(string primaryKeyValue);
IModelMaster IBusinessMasterBase.GetModel(string primaryKeyValue)
{
return GetModel(primaryKeyValue);
}
}
// 从辅助基类继承,override基类上abstract的方法
public class Sale_Order : BusinessMasterBase<SDERP.Model.Sale.Sale_Order>
{
public override IBusiness.Sale_Order GetModel(string SOID)
{
return dal.GetModel(SOID);
}
}
// 然后AService里面就不用is了
public abstract class AService : IService
{
private IBusinessMasterBase businessMasterBase;
public AService(IBusinessMasterBase businessMasterBase)
{
this.businessMasterBase = businessMasterBase;
}
public virtual IModels.IModelMaster GetMaster(string primary)
{
return businessMaster.GetModel(primary);
}
}