【发布时间】:2017-11-21 15:41:42
【问题描述】:
所以这个问题很明显是一块石头杀死两只鸟(一个设计和代码问题)我有一个基类,它有一个基接口
interface IBase
{
IBase Method1();
}
abstract class Base : IBase
{
IBase Method1()
{
//do work
return this;
}
}
现在是子类
interface IChild1 : IBase
{
IChild1 ChildMethod();
}
class Child1 : Base, IChild1
{
public IChild1 ChildMethod()
{
//do work
// this would work fine Method1(); ChildMethod2();
//but I want to chain methods
Method1().ChildMethod2();
return this;
}
void ChildMethod2()
{
//do work
}
}
问题的关键是我希望基类返回子类实例。从方法 ChildMethod() 中的代码可以看出,基类方法 Method1() 返回 IBase 的实例,因此链接 ChildMethod2() 是不可能的。是的,我可以生活而不必链接该方法,但假设这是我唯一的选择。
这是我使用泛型的尝试
interface IBase<T> where T : IBase<T>
{
T Method1();
}
abstract class Base<T> : IBase<T> where T : Base<T>
{
public T Method1()
{
//do work
return (T)this;
}
}
interface IChild1 : IBase<IChild1>
{
IChild1 ChildMethod();
}
class Child1 : Base<Child1>, IChild1
{
public IChild1 ChildMethod()
{
//do work
Method1(); ChildMethod2();
return this;
}
void ChildMethod2()
{
//do work
}
}
为了清楚地说明我想要实现的是,对于我对基类(在本例中为接口)进行的每次调用,我都希望返回调用类/接口。 注意:使用 Autofac 进行依赖注入
【问题讨论】:
-
您的泛型示例不起作用吗?我就是这样做的。你应该可以链接
Method1().ChildMethod2();。 -
@ChrisPickford 不起作用
-
你真的需要同时使用接口和父类吗?如果您只有没有接口的继承链会很容易。在这种情况下,泛型对于接口也毫无用处,因为您在使用它们时总是需要指定一些类:
IBase<SomeBaseClass>。 -
@Evk 我是否使用接口有关系吗?
-
如果你不使用接口,只使用基类层次结构,你可以以相对清晰的方式做你想做的事。你也可以用接口来做到这一点,但是它的工作方式(使用接口时必须指定类,例如:
IChild1<Child1>)会破坏使用这些接口的全部目的,所以这就是为什么我问你是否真的是否需要这些接口。
标签: c# .net inheritance design-patterns