从继承 class 获取特定方法

Getting specific method from inherited class

我有以下具有简单继承的对象模型:

public class RuntimeApiManagerBase
{
}

public class CatalogRuntimeApiManagerBase : RuntimeApiManagerBase
{
    public void Method1()
    {
    }
}

public class DocumentRuntimeApiManagerBase : RuntimeApiManagerBase
{
    public void Method2()
    {
    }

    public void Method3()
    {
    }
}

public class BaseObject
{
    public BaseObject(RuntimeApiManagerBase runtimeApiMgr)
    {
        RuntimeApiMgr = runtimeApiMgr;
    }
    public RuntimeApiManagerBase RuntimeApiMgr { get; set; }
}

public class Catalog : BaseObject
{
    public Catalog() : base(new CatalogRuntimeApiManagerBase())
    {
    }
}

public class Document : BaseObject
{
    public Document() : base(new DocumentRuntimeApiManagerBase())
    {
    }
}

现在,我想访问 RuntimeApiMgr 属性 完全基于派生类型的方法。但是,它没有显示任何符合逻辑的内容:

Catalog c1 = new Catalog();

// c1.RuntimeApiMgr. => No Method1

Document d1 = new Document();
// d1.RuntimeApiMgr. => No Method2 and Method3

是否可以使用不同的结构,如泛型或其他结构?

感谢您的宝贵时间。

使用泛型解决方案的替代方法是使用转换的老式方法。 也许是这样的:

Catalog c1 = new Catalog();
(c1.RuntimeApiMgr as CatalogRuntimeApiManagerBase).Method1();


Document d1 = new Document();
(d1.RuntimeApiMgr as DocumentRuntimeApiManagerBase).Method2();

或者在 Caltalog 和文档中创建同名的新属性 类:

public class Catalog : BaseObject
{
  public Catalog() : base(new CatalogRuntimeApiManagerBase())
  {
  }

  public new CatalogRuntimeApiManagerBase RuntimeApiMgr { get; set; }
}

您可以将 RuntimeApiManagerBase 用作泛型并具有类型约束,其中 T 必须是 RuntimeApiManagerBase 的子类

    public class BaseObject<T> where T : RuntimeApiManagerBase
    {
        public BaseObject(T runtimeApiMgr)
        {
            RuntimeApiMgr = runtimeApiMgr;
        }
        public T RuntimeApiMgr { get; set; }
    }

    public class Catalog : BaseObject<CatalogRuntimeApiManagerBase>
    {
        public Catalog() : base(new CatalogRuntimeApiManagerBase())
        {
        }
    }

    public class Document : BaseObject<DocumentRuntimeApiManagerBase>
    {
        public Document() : base(new DocumentRuntimeApiManagerBase())
        {
        }
    }

    Catalog c1 = new Catalog();

    c1.RuntimeApiMgr.Method1();

    Document d1 = new Document();
    d1.RuntimeApiMgr.Method2();

使用泛型:

public class BaseObject<T>
  where T : RuntimeApiManagerBase
{
    public BaseObject(T runtimeApiMgr)
    {
        RuntimeApiMgr = runtimeApiMgr;
    }
    public T RuntimeApiMgr { get; set; }
}

public class Catalog : BaseObject<CatalogRuntimeApiManagerBase>
{
    public Catalog() : base(new CatalogRuntimeApiManagerBase())
    {
    }
}

public class Document : BaseObject<DocumentRuntimeApiManagerBase>
{
    public Document() : base(new DocumentRuntimeApiManagerBase())
    {
    }
}

在这种情况下,您的 c1.RuntimeApiMgr 将是 CatalogRuntimeApiManagerBase 类型并且将具有 Method1