Не переопределять _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();
}
}