我有一个基本抽象类“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类派生的类。每个子类都有几乎完全相同的方法。我试图将这些方法移动到基类,以便在更改时更改更少的代码。我会尝试找到另一种方法来做到这一点,因为我要求的是无法做到的。谢谢你的回复。
答案 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
),这是非常奇怪的,属性应该是静态的,你试图做单例模式吗?