C# 基类使用泛型时如何隐藏成员函数

C# 基类使用泛型时如何隐藏成员函数,c#,inheritance,C#,Inheritance,我有以下类,当我在BaseScriptConfigurationList上调用CreateQuerySettings时,它从ConfigurationList返回新的QuerySettings,而不是BaseScriptConfigurationList中的层次结构QuerySettings值: public abstract class ConfigurationList<TConfigurationObject, TPropertyEnum> { public QuerySe

我有以下类,当我在BaseScriptConfigurationList上调用
CreateQuerySettings
时,它从
ConfigurationList
返回新的
QuerySettings
,而不是
BaseScriptConfigurationList
中的
层次结构QuerySettings
值:

public abstract class ConfigurationList<TConfigurationObject, TPropertyEnum>
{
  public QuerySettings<TConfigurationObject, TPropertyEnum> CreateQuerySettings()
  {
    return new QuerySettings<TConfigurationObject, TPropertyEnum>();
  }
}

public class BaseScriptConfigurationList : EditableConfigurationList<BaseScriptConfiguration, BaseScriptConfiguration.Property>
{
  public BaseScriptConfigurationList(ConfigurationManager configurationManager)
    : base(configurationManager, InternalAdminObjectType.BaseScript)
  {
     _BaseScriptPageListWatcher = new ConfigurationList<BaseScriptPageConfiguration, BaseScriptPageConfiguration.Property>.
     ConfigurationWatcher(null);

      _ConfigurationWatcher.ChildWatchers.Add(_BaseScriptPageListWatcher);

  }

  public new QuerySettings<BaseScriptConfiguration, BaseScriptConfiguration.Property> CreateQuerySettings()
  {
    return new HierarchicalQuerySettings<BaseScriptConfiguration, BaseScriptConfiguration.Property, BaseScriptQueryChildrenSettings>();
  }
}
当我进行此调用时,它进入ConfigurationList.CreateQuerySettings方法


如何隐藏
CreateQuerySettings
方法,以便在从
BaseScriptConfigurationList
类调用它时,得到一个
hierarchycalquerysettings
对象?

新的
修饰符可以是beasty。请注意,在您的示例中,您是隐藏而不是覆盖。您没有显示代码的这一部分,但我假设您有以下情况:

class Base
{
   public static void BaseMethod() { Console.WriteLine("BASE!"); }
}

class Derived : Base
{
   // Hides Base.BaseMethod()
   new public static void BaseMethod() { Console.WriteLine("DERIVED!"); }   
}

Base a = new Base();
a.BaseMethod(); // -> "BASE!"

Base b = new Derived();
b.BaseMethod(); // -> "BASE!"

Derived b = new Derived();
b.BaseMethod(); // -> "DERIVED!"

BaseScriptConfigurationList.CreateQuerySettings()中
您的返回类型是
QuerySettings
,因此您将始终获得该类型作为返回值,但您返回的是
层次结构QuerySettings
。您可以将
CreateQuerySettings()
的返回类型更改为
HierarchicalQuerySettings
或两个,将对象强制转换为其子类型“
HierarchicalQuerySettings
”。如果确实要隐藏它,可以执行以下操作:

public class newclass : BaseScriptConfigurationList
{
    public new HierarchicalQuerySettings<BaseScriptConfiguration, BaseScriptConfiguration.Property> CreateQuerySettings()
    {
        return (HierarchicalQuerySettings<BaseScriptConfiguration, BaseScriptConfiguration.Property>)base.CreateQuerySettings();
    }
}

注意:我假设您的架构大致设置如下:

public abstract class ConfigurationList<TConfigurationObject, TPropertyEnum>
{
    public QuerySettings<TConfigurationObject, TPropertyEnum> CreateQuerySettings()
    {
        return new QuerySettings<TConfigurationObject, TPropertyEnum>();
    }
}

public class TConfigurationObjectList : ConfigurationList<BaseScriptConfiguration, BaseScriptConfiguration.Property>
{

}

public class EditableConfigurationList<T, T1> : TConfigurationObjectList
{
    protected EditableConfigurationList(ConfigurationManager configurationManager, object baseScript)
    {
        throw new NotImplementedException();
    }
}

public class BaseScriptConfigurationList : EditableConfigurationList<BaseScriptConfiguration, BaseScriptConfiguration.Property>
{
    public BaseScriptConfigurationList(ConfigurationManager configurationManager)
        : base(configurationManager, InternalAdminObjectType.BaseScript)
    {

    }

    public new QuerySettings<BaseScriptConfiguration, BaseScriptConfiguration.Property> CreateQuerySettings()
    {
        return new HierarchicalQuerySettings<BaseScriptConfiguration, BaseScriptConfiguration.Property, BaseScriptQueryChildrenSettings>();
    }
}

public class QuerySettings<T, T1>
{
}

public class HierarchicalQuerySettings<T, T1, T2> : QuerySettings<BaseScriptConfiguration, BaseScriptConfiguration.Property>
{
}

public class BaseScriptQueryChildrenSettings
{
}

public class BaseScriptPageConfiguration
{
    public class Property
    {
    }
}

public class InternalAdminObjectType
{
    public static object BaseScript { get; set; }
}

public class ConfigurationManager
{
}

public class BaseScriptConfiguration
{
    public class Property
    {
    }
}
公共抽象类配置列表
{
公共查询设置CreateQuerySettings()
{
返回新的查询设置();
}
}
公共类TConfigurationObjectList:ConfigurationList
{
}
公共类EditableConfigurationList:TConfigurationObjectList
{
受保护的EditableConfigurationList(ConfigurationManager ConfigurationManager,object baseScript)
{
抛出新的NotImplementedException();
}
}
公共类BaseScriptConfigurationList:EditableConfigurationList
{
public BaseScriptConfigurationList(ConfigurationManager ConfigurationManager)
:base(configurationManager,InternalAdminObjectType.BaseScript)
{
}
公共新查询设置CreateQuerySettings()
{
返回新的HierarchicalQuerySettings();
}
}
公共类查询设置
{
}
公共类层次结构QuerySettings:QuerySettings
{
}
公共类BaseScriptQueryChildrenSettings
{
}
公共类BaseScriptPageConfiguration
{
公共类财产
{
}
}
公共类InternalAdminObjectType
{
公共静态对象BaseScript{get;set;}
}
公共类配置管理器
{
}
公共类BaseScriptConfiguration
{
公共类财产
{
}
}

ConfigurationList
类创建一个基本接口(比如
IConfigurationList
)并使用此接口作为变量
cl
的数据类型,而不是
TConfigurationList

请提供用于调用create BaseScriptConfigurationList对象的代码,以准确了解遇到的情况。的确,我们在这里看不到全貌--EditableConfigurationList的定义在哪里?另外,“基类”是一个子类这一事实尤其令人困惑。我添加了调用代码来帮助解释发生了什么。@Rachel Martin,更新了您的说明,帮助我了解我们正在断开的连接
TConfigurationObjectList
是调用方法的泛型类型。它看起来是这样的:
retrieverReferencedObjects(TPropertyEnum idProperty,IEnumerable id)
因此,当我尝试执行
var cl=(obj as BaseScriptConfigurationList)时??(t配置对象列表)obj,无法编译。在我上面概述的案例中,
TConfigurationObjectList
BaseScriptConfigurationList
。另外,粗略地说,
public abstract class EditableConfigurationList:ConfigurationList
在定义的案例中,您必须将其强制转换到BaseConfigurationList才能访问所需的成员。或者,如果总是该类型,则可以强制转换QuerySettings。如果总是那样的话,就把它扔到Constructor电话上。我会继续,把这个标记为答案。我能够创建一个
BaseScriptConfigurationList
来调用
CreateQuerySettings
。然后,我可以将querySettings设置为我得到的值。我怀疑问题实际上在于调用构造函数的方式,但我无法修复它。
var obj = typeof(TConfigurationObjectList).GetConstructor(new Type[] { typeof(ConfigurationManager) }).Invoke(new object[] { Manager.ConfigurationManager });
var cl = (obj  as BaseScriptConfigurationList) ?? (TConfigurationObjectList)obj;
// or do something else
var querySettings = cl.CreateQuerySettings();
public abstract class ConfigurationList<TConfigurationObject, TPropertyEnum>
{
    public QuerySettings<TConfigurationObject, TPropertyEnum> CreateQuerySettings()
    {
        return new QuerySettings<TConfigurationObject, TPropertyEnum>();
    }
}

public class TConfigurationObjectList : ConfigurationList<BaseScriptConfiguration, BaseScriptConfiguration.Property>
{

}

public class EditableConfigurationList<T, T1> : TConfigurationObjectList
{
    protected EditableConfigurationList(ConfigurationManager configurationManager, object baseScript)
    {
        throw new NotImplementedException();
    }
}

public class BaseScriptConfigurationList : EditableConfigurationList<BaseScriptConfiguration, BaseScriptConfiguration.Property>
{
    public BaseScriptConfigurationList(ConfigurationManager configurationManager)
        : base(configurationManager, InternalAdminObjectType.BaseScript)
    {

    }

    public new QuerySettings<BaseScriptConfiguration, BaseScriptConfiguration.Property> CreateQuerySettings()
    {
        return new HierarchicalQuerySettings<BaseScriptConfiguration, BaseScriptConfiguration.Property, BaseScriptQueryChildrenSettings>();
    }
}

public class QuerySettings<T, T1>
{
}

public class HierarchicalQuerySettings<T, T1, T2> : QuerySettings<BaseScriptConfiguration, BaseScriptConfiguration.Property>
{
}

public class BaseScriptQueryChildrenSettings
{
}

public class BaseScriptPageConfiguration
{
    public class Property
    {
    }
}

public class InternalAdminObjectType
{
    public static object BaseScript { get; set; }
}

public class ConfigurationManager
{
}

public class BaseScriptConfiguration
{
    public class Property
    {
    }
}