有些难啊:为何抽象类的实例不能作为参数传给子类对象???问题说明:    IndexTask属于抽类,ClubIndexTask属于抽类的子类;    IndexTask task = info.Invoke(new object[] {  this.numberOfItemsToIndex }) as IndexTask;    通过反射获取一个对象实例,由于子类是不确定的,因此上面用到了抽象类作为类型声明;    这时问题来了。
    server.Insert(task, this.enableAutoOptimization);
      
         public class ClubIndexTask : IndexTask    把抽象类的实例传给一个指定类型的子类时,出错!    提示:
  
   “BusinessServer.Search.IndexServer<T>.Insert(BusinessServer.Search.ClubIndexTask, bool)”
    最匹配的重载方法具有一些无效参数 代码如下:
    /// <summary>
    /// 索引任务类 (抽象类)
    /// </summary>
    [Serializable]
    public abstract class IndexTask
    {
      ....
    }    /// <summary>
    /// 论坛索引任务类
    /// </summary>
    [Serializable]
    public class ClubIndexTask : IndexTask
    {
...
    }
    /// <summary>
    /// 索引服务类 
    /// </summary>
    public class IndexServer<T> : MarshalByRefObject where T : class
    {
        /// <summary>
        /// 加入记录 - OneWay:单向
        /// </summary>
        [OneWay]
        //public void Insert(IndexTask task, bool optimize)     // 正常
        public void Insert(ClubIndexTask task, bool optimize)   // 出错
        {
            new IndexManager<T>().Insert(task, optimize);
        }
     }    /// <summary>
    /// 索引管理操作类
    /// </summary>
    [Serializable]
    internal class IndexManager<T> where T: class
    {
         // 反射的同时传参数,并返回任务对象实例 
         IndexTask task = info.Invoke(new object[] {  this.numberOfItemsToIndex }) as IndexTask;         // 执行服务
         server.Insert(task, this.enableAutoOptimization);         ...
    }

解决方案 »

  1.   

    之所以被调用函数不用抽象类作为参数
    public void Insert(IndexTask task, bool optimize)    // 正常 而用:
    public void Insert(ClubIndexTask task, bool optimize)  // 出错 主要原因是目标子类较多,因此我想用重载的方法执行不同的子类方法.....
      

  2.   


    abstract class Person {}
    class Student : Person {}
    class Teacher : Person {}public delegate void Func1(Student person);
    public delegate void Func2(Person person);
    Person比Student和Teacher大,在Func1这个委托中,它请求一个Student,显然你不能把Person给它,因为它仅能处理一个Student的对象。
           // 反射的同时传参数,并返回任务对象实例 
            IndexTask task = info.Invoke(new object[] {  this.numberOfItemsToIndex }) as IndexTask;         // 执行服务 
            server.Insert(task, this.enableAutoOptimization); 如果你上面定义成“public void Insert(ClubIndexTask task, bool optimize)”,那么这里要将IndexTask塞进去,肯定是不行的,因为Insert方法仅能处理ClubIndexTask对象。
      

  3.   

    这问题不是: 老子不能进儿子的家....  这OOP也太嗅了...这问题有解吗?
      

  4.   

    编译就通不过了...  主要是现在需求有改动, 就是说Insert方法需要根据不同的子类进行重载.... 
    因此我才会把IndexTask类型改成了ClubIndexTask子类, 造成编译错误..... 因为子类有5个左右... 如果不用重载, 势必比较麻烦...... 因此才向各位大哥求教有没有什么简洁的处理方法.... 代码相当长的, 只能贴关键的部份了.....
      

  5.   

    这个不是OOP的原因,而是你用了模版类的原因。模版类在使用时会生成一个具体的类,所以IndexServer<IndexTask>和IndexServer<ClubIndexTask>是不一样的,并不是你想的那个继承关系。其实你这里没必要用模版类,只用抽象关系就可以了
      

  6.   

    public void Insert(T task, bool optimize)  // 出错
            {
                new IndexManager <T>().Insert(task, optimize);
            }Manager的:
    public void Insert(T task, bool optimize)
            {
            }
    这样也是可以的