请问一个继承类的判断有关问题

请教一个继承类的判断问题。
我有一个类,类名是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就已经是不同类型了。
------解决思路----------------------
引用:
我有一个类,类名是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的,求解释。。


泛型参数有继承性,不意味着泛型就有继承性,实际上二者没有关系。
------解决思路----------------------
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);
    }
}