有些难啊:为何抽象类的实例不能作为参数传给子类对象???问题说明: 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); ...
}
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); ...
}
public void Insert(IndexTask task, bool optimize) // 正常 而用:
public void Insert(ClubIndexTask task, bool optimize) // 出错 主要原因是目标子类较多,因此我想用重载的方法执行不同的子类方法.....
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对象。
因此我才会把IndexTask类型改成了ClubIndexTask子类, 造成编译错误..... 因为子类有5个左右... 如果不用重载, 势必比较麻烦...... 因此才向各位大哥求教有没有什么简洁的处理方法.... 代码相当长的, 只能贴关键的部份了.....
{
new IndexManager <T>().Insert(task, optimize);
}Manager的:
public void Insert(T task, bool optimize)
{
}
这样也是可以的