2

我有一个基本抽象类“BaseEngine”和一个子类“Engine:BaseEngine”。

Engine 有一个名为“Instance”的 Engine 类型的公共属性:

public Engine Instance
{ get; set; }

我想从 BaseEngine 获取这个实例。我已经尝试过了:

public abstract BaseEngine<T> where T : class
{
    public T Instance { get; set; }
}

public Engine : BaseEngine<Engine>

但它会产生递归。

你有什么建议吗?谢谢!

更新

我有很多从 BaseEngine 类派生的类。每个子类都有实际上做同样事情的方法。我试图将这些方法移到基类中,以便在发生更改时更改更少的代码。我将尝试找到另一种方法来做到这一点,因为我所要求的无法完成。谢谢您的回复。

4

2 回答 2

1

由于我不太了解您要做什么,您应该知道,如果您有 的实例Engine,那么即使它不知道,BaseEngine仍然有代码。Engine无论如何,它不应该知道派生类是什么,因为那将是代码异味。

但是,如果您需要从基类访问 Engine 中的函数,您可以创建基类并在基类中abstract创建abstract函数(即没有实现的函数)并让派生类实现它们。

或者您可以创建virtual函数并拥有派生类override,然后可以替换或添加其他功能。

这通常是在派生类中具有基类访问功能的推荐方式。

例如:

public abstract class BaseEngine
{
  public void DoStuff()
  {
    // Do some things here
    DoDerivedStuff();
    // Do some other things here
  }

  protected abstract void DoDerivedStuff();

  public virtual void DoOverridableStuff()
  {
    // Do stuff in here.
  }
}

public class Engine : BaseEngine
{
   protected override void DoDerivedStuff()
   {
     // Do stuff here that is particular to this derived type.
   }

   public override void DoOverridableStuff()
   {
      // Do additional stuff for the Engine class if necessary
      base.DoOverridableStuff(); // You can omit this if you don't 
                                 // want to do what the base is doing.
      // Do more stuff for the engine class if necessary
   }
}
于 2013-09-26T13:55:36.523 回答
0

您不能将Instance属性键入到子类,您需要返回BaseEngine,但您可以返回Engine该属性中的实例,调用者只需要在需要时强制转换它。

public abstract class BaseEngine
{
    public BaseEngine Instance {get; private set;}
}

public class FarrariEngine : BaseEngine
{
    public FarrariEngine()
    {
        this.Instance = this; //This line is VERY weird to me.
    }
}

public class LawnmowerEngine : BaseEngine
{
    public LawnmowerEngine ()
    {
        this.Instance = this;
    }
}


public class Program
{
    public static Main(string[] args)
    {
        var farrari = new FarrariEngine();
        Engine currentEngine = farrari.Instance. //Works
        FarrariEngine currentFarrariEngine = (FarrariEngine)farrari.Instance. //Also works.

        var lawnMower = new LawnmowerEngine();
        Engine currentEngine = lawnMower.Instance. //Works
        LawnmowerEngine currentLawnmowerEngine = (LawnmowerEngine)lawnMower.Instance. //Also works.
    }
}

这在 .NET 框架中很常见,请查看WebRequest的子项。一切GetResponse()返回基本类型

但是很奇怪,您有一个返回父类类型(特别是称为Instance)的属性,该属性是否应该是静态的并且您正在尝试执行单例模式?

于 2013-09-26T13:54:32.677 回答