【发布时间】:2015-06-10 21:36:35
【问题描述】:
我将首先解释我尝试这样做的原因。 我的初始层次结构:
BaseClass
|
ControlClass
| \
CalltoBase DerivedClass1
|
CalltoBase
两个调用路径都命中基类的特定方法 根据 CalltoBase 的来源,我需要使用 该方法的不同实现。 这是我通常会做的:
BaseClass____DerivedClass2
| |
ControlClass ControlClass2
| \ | \
call DerivedClass1 call DerivedClass3
call call
问题是这个项目正在增长,将有必要 基类中该方法的更多实现。 因此,我想做这样的事情的原因,我会 每次遇到这种情况时,我只需要创建 1 个额外的派生类而不是 3 个。
BaseClass
| \______
ControlClass<t> \_____
| \ \
call DerivedClass1<t> tClass
call
注意:除调用行外的每一行都是继承 我没有权限或时间来更改 系统,这样它们就不会被继承。
我的目标是做这样的事情:
public class BaseClass{code}
public class tClass : BaseClass {code}
public class ControlClass<t> : t where t : BaseClass {code}
public class DerivedClass1<t> : ControlClass<t> where t : BaseClass {code}
//defaults
public class ControlClass : ControlClass<BaseClass> {empty}
public class DerivedClass1 : ControlClass<BaseClass> {empty}
这样的事情可能吗,还是我应该接受我被搞砸了,每次都制作所有派生类?
编辑1********************************************** 在做了更多研究之后,我认为我真正的问题是: 当没有显式注入依赖项时,如何使用依赖注入来覆盖方法或设置默认方法?
编辑2************************************************
这段代码都在公司创建并被许多项目使用的库中。它适用于使用 selenium/specflow 的 UAT。
public class BaseClass
{
public T Control<T>(string controlName, string pageName = null)
where T : class
{
By sel = GetSelector(controlName, pageName)
...
return control as T;
}
private By GetSelector(string controlName, string pageName = null)
{
pageName = string.IsNullOrEmpty(pageName) ?
pageMapping[Browser.GetPage()] : pageName;
...
return selector;
}
}
public class ControlClass : BaseClass
{
public NgElement NgControl(string controlName, string pageName)
{
By sel = GetSelector(controlName, pageName);
...
return element;
}
public By GetSelector(string controlName, string pageName)
{
pageName = string.IsNullOrEmpty(pageName) ? PageName : pageName;
pageName = string.IsNullOrEmpty(pageName) ?
pageMapping[Browser.GetPage()] : pageName;
...
return selector;
}
public string PageName
{
get
{
...
return returnPage.Value;
}
}
}
public class DerivedClass1 : ControlClass
{
//SpecFlow GWT's
GivenAngularClicks(string controlName)
{
WaitForAngular();
NgControl(crontrolName).Click();
}
}
改变pageName的部分是根据调用者是哪个项目需要修改的部分。调用哪个派生类并不重要,重要的是实例化基类的类。
【问题讨论】:
-
你为什么要这样做?你为什么要注入一种方法?您能否详细说明这里的场景,使其更具体,也许存在完全不同的解决方案?
-
要遵循您的目标真的很难。一个显示谁在调用什么的最小代码示例,带有多余的参数并删除了您的其余代码,这可能更容易理解。目前尚不清楚为什么不能将基本方法声明为虚拟方法并在层次结构中适当地覆盖它。
标签: c# generics inheritance dependency-injection