在C#中使用基类和基接口

时间:2019-04-04 09:15:07

标签: c# inheritance interface multiple-inheritance

我正在重塑不使用基类和基接口的整个系统。

我的想法是将所有通用方法提取到基类和基接口。
因此,基本上,我们将:

  • 实现接口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

2 个答案:

答案 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();
 }
}

如果您的IMySessionBaseIMySessionDerived遵循层次结构,则应该可以使用。但是在极少数情况下,您可能最终会遇到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();
 }
}