【发布时间】:2010-04-09 01:04:13
【问题描述】:
我正在尝试为抽象泛型基类提供接口。我希望在使用泛型类型的接口上公开一个方法,但其实现最终由从我的抽象泛型基继承的类处理。
但是我不希望子类必须向下转换才能使用泛型类型(因为它们已经知道应该是什么类型)。
这是我目前看到的让它工作的唯一方法的简单版本。
public interface IFoo
{
void Process(Bar_base bar);
}
public abstract class FooBase<T> : IFoo
where T : Bar_base
{
abstract void Process(T bar);
// Explicit IFoo Implementation
void IFoo.Process(Bar_base bar)
{
if (bar == null) throw new ArgumentNullException();
// Downcast here in base class (less for subclasses to worry about)
T downcasted_bar = bar as T;
if (downcasted_bar == null)
{
throw new InvalidOperationException(
string.Format("Expected type '{0}', not type '{1}'",
T.ToString(), bar.GetType().ToString());
}
//Process downcasted object.
Process(downcasted_bar);
}
}
那么 FooBase 的子类看起来像这样......
public class Foo_impl1 : FooBase<Bar_impl1>
{
void override Process(Bar_impl1 bar)
{
//No need to downcast here!
}
}
显然这不会为我提供编译时类型检查,但我认为它会完成工作......
问题:
1.这个功能会像我想的那样吗?
2. 这是最好的方法吗?
3. 这样做有什么问题?
4. 你能建议一种不同的方法吗?
谢谢!
编辑:针对许多答案,要求 IFoo 不是通用的。我需要能够操作 IFoo 对象的集合,而不管它们使用什么泛型类型。
编辑:为了澄清这个原因......
Bar_base 包含对 IFoo 类型的引用。并且必须调用 process 方法来验证它包含的数据。将 IFoo 视为包含 Bar_base 派生对象的验证逻辑的对象。当 Bar_base 对象的有效性受到质疑时,它会在其 IFoo 引用上调用 Process 来验证自己。
IFoo 不能是通用的原因是我需要能够引用独立于 Bar_base 类的 IFoo 集合。
我将尝试使用两个接口的方法,一个包含 Process 方法的通用接口,一个不包含 Process 方法的非通用接口。
【问题讨论】:
-
如果你重写 Process(...) 函数,你打算如何执行基类中的代码?您如何看待使用中的代码流?
-
@galford13x - 我的印象是 IFoo.Process 方法的显式实现将在调用接口引用时被调用。否则,基类 Process 方法是抽象的,所以我希望我的继承类实现。
-
你能解释一下为什么非通用 IFoo 是一个要求吗?
-
通过泛型/非泛型接口对,我已经成功地将 List
与 IFoo 成员的异构组合一起使用。列表的客户端只能使用非泛型接口中定义的方法。不过,类 Foo 可能需要在管理上变得相当棘手。 -
是的,看起来这可能会奏效,因为在需要验证自身时,需要访问 Process 方法的唯一对象实际上是 Bar_base 派生对象。明天试试。