获取子类的实例

时间:2013-09-26 13:45:58

标签: c# class inheritance

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

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

public Engine Instance
{ get; set; }

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

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

public Engine : BaseEngine<Engine>

但它会产生递归。

你有什么建议吗? 谢谢!

更新

我有很多从BaseEngine类派生的类。每个子类都有几乎完全相同的方法。我试图将这些方法移动到基类,以便在更改时更改更少的代码。我会尝试找到另一种方法来做到这一点,因为我要求的是无法做到的。谢谢你的回复。

2 个答案:

答案 0 :(得分:1)

由于我对你要做的事情了解不多,你应该知道如果你有一个Engine的实例,那么BaseEngine中的代码仍然有一个{{1即使它不知道那个。它不应该知道派生类在任何情况下是什么,因为那将是代码气味。

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

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

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

例如:

override

答案 1 :(得分: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()之类的内容全部返回the base type

然而,如果你有一个返回父类的类型的属性(特别是名为Instance),这是非常奇怪的,属性应该是静态的,你试图做单例模式吗?