Tha*_*hal 2 c# generics polymorphism
我有以下类层次结构:
EstadoBaseMO (父)
EstadoSAMO(EstadoBaseMO child)EstadoGesDocMO(EstadoBaseMO child)SolicitudBasePresenter(父)
SolicitudGesDocPresenter(SolicitudBasePresenter child)SolicitudSAPresenter(SolicitudBasePresenter child) EstadoBaseBO(父)
EstadoGesDocBO(EstadoBaseBO child)EstadoSABO(EstadoBaseBO child) 我需要实现一个调用的方法SaveNewDetailStates,用下面的实施SolicitudBasePresente是
public bool SaveNewDetailStates(List<EstadoBaseMO> estados)
{
bool result = true;
if (estados.Any())
{
try
{
EstadoGesDocBO bo = new EstadoGesDocBO();
foreach (var estado in estados)
{
var savedState = bo.Insert(estado);
result &= ((savedState != null) && (savedState.Id != estado.Id));
}
}
catch (Exception ex)
{
result = false;
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
SolicitudGesDocPresenter.SaveNewDetailStates 履行
public bool SaveNewDetailStates(List<EstadoGesDocMO> estados)
{
bool result = true;
if (estados.Any())
{
try
{
EstadoGesDocBO bo = new EstadoGesDocBO();
foreach (var estado in estados)
{
var savedState = bo.Insert(estado);
result &= ((savedState != null) && (savedState.Id != estado.Id));
}
}
catch (Exception ex)
{
result = false;
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
SolicitudSAPresenter.SaveNewDetailStates 履行
public bool SaveNewDetailStates(List<EstadoSAMO> estados)
{
bool result = true;
if (estados.Any())
{
try
{
EstadoSABO bo = new EstadoSABO();
foreach (var estado in estados)
{
var savedState = bo.Insert(estado);
result &= ((savedState != null) && (savedState.Id != estado.Id));
}
}
catch (Exception ex)
{
result = false;
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,代码完全相同,有两个不同之处,在SolicitudSAPresenter我使用EstadoSAMO和EstadoSABO类中,类似于SolicitudGesDocPresenter.要知道的事情:
SolicitudBasePresenter.SaveNewDetailStatesSolicitudBasePresenter.SaveNewDetailStates)转换为抽象方法,但是,然后,SAPresenter并且GesDocPresenter不能使用覆盖,因为它们需要实现相同的签名(并且它不一样..),此外,在我意识到我需要之后不久一个具体的实现SolicitudBasePresenter,所以它不应该是一个抽象类(与虚方法类似)SaveNewDetailStates<T,K>(List<T> estados),但后来我迷路了,我不知道还能做些什么.编写此代码的最佳方法是什么?
我唯一的解决方案是SaveNewDetailStates从父级演示者中删除,并在子级中编写具体的实现,然后一切都很好但是...我认为这甚至不是一个好的开发人员的解决方案..
你需要使用泛型.定义类EstadoBaseMO<T>,然后T在save方法中使用类型.
public bool SaveNewDetailStates(List<T> estados)
Run Code Online (Sandbox Code Playgroud)
然后您的子课程可以(例如)延长EstadoBaseMO<SolicitudBasePresenter>.
在线有很多泛型教程,看看其中的一些.
https://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx