我正在重塑不使用基类和基接口的整个系统。
我的想法是将所有通用方法提取到基类和基接口。
因此,基本上,我们将:
实现接口SomeClassBase
的基类ISomeClassBase
实现ISomeClassDerived
的派生类SomeClassDerived(此接口派生自ISomeClassBase
)
现在是问题所在,如何在派生类(与基本类具有不同的类型转换)中实例化“ _mySession”,同时保留基本类中的所有方法:
public class SomeClassBase : ISomeClassBase
{
public IMySessionBase _mySession = MySession.Instance();
public SomeClassBase ()
{
_mySession.connect(); // Needed??
}
public void doSomething()
{
_mySession.doSomething();
}
}
public class SomeClassDerived : SomeClassBase, ISomeClassDerived
{
public IMySessionDerived _mySession = MySession.Instance();
public SomeClassDerived ()
{
_mySession.connect();
}
public void doSomethingElse()
{
_mySession.doSomethingElse();
}
}
还有另一件事,IMySessionDerived
实现了IMySessionBase
。
答案 0 :(得分:0)
粘贴@Selvin答案,而不是注释中隐藏的链接:
这里的技巧是使用关键字“ base()”
BASE_URL
答案 1 :(得分:-1)
不要重新定义_mySession
,让它来自基类。
但是,在派生类中,您仍然可以重新分配。
public class SomeClassDerived : SomeClassBase, ISomeClassDerived
{
public SomeClassDerived ()
{
_mySession = MySession.Instance(); //Declaration comes from base class automatically
_mySession.connect();
}
public void doSomethingElse()
{
_mySession.doSomethingElse();
}
}
如果您的IMySessionBase
和IMySessionDerived
遵循层次结构,则应该可以使用。但是在极少数情况下,您可能最终会遇到DoubleDispatchProblem。
如所指出的,如果您想从IMySessionDerived
做些什么,您可以添加一个属性。
public class SomeClassDerived : SomeClassBase, ISomeClassDerived
{
IMySessionDerived _derivedSessionAccessor=> _mySession as IMySessionDerived;
}
更新:要在此处解决确切的设计问题,
将其作为字段而不是从基类派生。并从接口继承。因此,除了执行上述方法之外,
喜欢,
public class SomeClassBase : ISomeClassBase
{
public IMySessionBase _mySession ;
public SomeClassBase ( IMySessionBase session)
{
_mySession=session;
_mySession.connect(); // Needed??
}
public void doSomething()
{
_mySession.doSomething();
}
}
public class SomeClassDerived : , ISomeClassDerived
{
public IMySessionDerived _mySession = MySession.Instance();
private SomeClassBase _baseClassInstance;
public SomeClassDerived ()
{
_baseClassInstance=new SomeClassBase(_mySession);
//_mySession.connect();
}
public void doSomethingElse()
{
_baseClassInstance.doSomethingElse();
}
}