C# C语言中的抽象类和方法#

C# C语言中的抽象类和方法#,c#,inheritance,abstract-class,C#,Inheritance,Abstract Class,我想为应用程序中要继承的所有参数类型类创建一个抽象基类。所有参数都将具有名称、ID和必需的属性 所有参数都将通过SetProperties方法从XML设置其属性(下面显示的XmlParser类仅用于演示) 由于所有参数都具有相同的3个属性,我希望基类设置这些属性,但让继承类扩展SetProperties方法以设置它包含的其他属性 我想在控件上重写事件 这是我所想的一个例子,尽管它不起作用 abstract class ParameterBase { protected string Pa

我想为应用程序中要继承的所有参数类型类创建一个抽象基类。所有参数都将具有名称、ID和必需的属性

所有参数都将通过SetProperties方法从XML设置其属性(下面显示的XmlParser类仅用于演示)

由于所有参数都具有相同的3个属性,我希望基类设置这些属性,但让继承类扩展SetProperties方法以设置它包含的其他属性

我想在
控件上重写事件

这是我所想的一个例子,尽管它不起作用

abstract class ParameterBase
{
    protected string ParameterName;
    protected bool IsRequired;
    protected int ParameterId;

    public abstract void SetProperties(string xml)
    {
        this.ParameterName = XmlParser.GetParameterName(xml);
        this.IsRequired = XmlParser.GetIsRequired(xml);
        this.ParameterId = XmlParser.GetParameterId(xml);
    }
}

abstract class Parameter1 : ParameterBase
{
    private string _value;

    public string ParameterName
    {
        get { return base.ParameterName; }
    }

    public bool IsRequired
    {
        get { return base.IsRequired; }
    }

    public int ParameterId
    {
        get { return base.ParameterId; }
    }

    public string Value
    {
        get { return _value; }
    }

    public Parameter1()
    {

    }

    public override void SetProperties(string xml)
    {
        base.SetProperties(xml);

        _value = XmlParser.GetValue(xml);
    }
}

我只想这样做:

abstract class ParameterBase
{
    protected string ParameterName;
    protected bool IsRequired;
    protected int ParameterId;

    public abstract void SetProperties(string xml);

}
还有一个:

public  class Parameter1 : ParameterBase 
{
    public override void SetProperties(string sml)
    {
       //set properties including those ones of parent
    }
}
以这种方式进行管理既简单又清晰。在单独的基类中移动公共属性这很好,但是持久性管理(保存/加载)留给子类。他们应该知道怎么做

提供的代码有几个问题:

  • 摘要
    方法不能有正文

  • 您有奇怪的
    public override void SetValues(字符串xml)
    ,我认为应该是
    public override void SetProperties(字符串xml)


我只想这样做:

abstract class ParameterBase
{
    protected string ParameterName;
    protected bool IsRequired;
    protected int ParameterId;

    public abstract void SetProperties(string xml);

}
还有一个:

public  class Parameter1 : ParameterBase 
{
    public override void SetProperties(string sml)
    {
       //set properties including those ones of parent
    }
}
以这种方式进行管理既简单又清晰。在单独的基类中移动公共属性这很好,但是持久性管理(保存/加载)留给子类。他们应该知道怎么做

提供的代码有几个问题:

  • 摘要
    方法不能有正文

  • 您有奇怪的
    public override void SetValues(字符串xml)
    ,我认为应该是
    public override void SetProperties(字符串xml)


    • 你把事情弄得太复杂了。前三个属性可以从基类继承:

      public abstract class ParameterBase 
      { 
          public string ParameterName { get; private set; }
          public bool IsRequired { get; private set; }
          public int ParameterId { get; private set; }
      
          public virtual void SetProperties(string xml) 
          { 
              ParameterName = XmlParser.GetParameterName(xml); 
              IsRequired = XmlParser.GetIsRequired(xml); 
              ParameterId = XmlParser.GetParameterId(xml); 
          } 
      } 
      
      public class Parameter1 : ParameterBase 
      { 
          public string Value { get; private set; }
      
          public override void SetProperties(string xml)
          {
              base.SetProperties(xml);
              Value = XmlParser.GetValue(xml);
          }
      } 
      
      还请注意,抽象方法不能有正文,而是以分号结尾:

      public abstract void SetProperties(string xml);
      
      如果您想给它一个基本的实现,您必须将它作为虚拟的


      (您必须重写
      SetProperties
      ,而不是
      SetValue

      您把它弄得太复杂了。前三个属性可以从基类继承:

      public abstract class ParameterBase 
      { 
          public string ParameterName { get; private set; }
          public bool IsRequired { get; private set; }
          public int ParameterId { get; private set; }
      
          public virtual void SetProperties(string xml) 
          { 
              ParameterName = XmlParser.GetParameterName(xml); 
              IsRequired = XmlParser.GetIsRequired(xml); 
              ParameterId = XmlParser.GetParameterId(xml); 
          } 
      } 
      
      public class Parameter1 : ParameterBase 
      { 
          public string Value { get; private set; }
      
          public override void SetProperties(string xml)
          {
              base.SetProperties(xml);
              Value = XmlParser.GetValue(xml);
          }
      } 
      
      还请注意,抽象方法不能有正文,而是以分号结尾:

      public abstract void SetProperties(string xml);
      
      如果您想给它一个基本的实现,您必须将它作为虚拟的


      (并且您必须重写
      SetProperties
      ,而不是
      SetValue

      我将使用受保护的setter公开公共基类属性,然后您可以从任何派生类访问它们,无需复制代码

      protected string ParameterName { get; protected set; }; 
      protected bool IsRequired  { get; protected set; }; 
      protected int ParameterId  { get; protected set; };
      

      我将使用受保护的setter公开公共基类属性,然后您可以从任何派生类访问它们,无需复制代码

      protected string ParameterName { get; protected set; }; 
      protected bool IsRequired  { get; protected set; }; 
      protected int ParameterId  { get; protected set; };
      

      我可以看到您的代码存在四个问题:

    • 您正在重新定义3个共享属性,并尝试将它们命名为与现有字段相同的名称。这是不允许的。最简单的方法是在基类中实现属性,方法与在继承类中实现
      Value
      的方法相同:使用支持字段。在C#3.0及更高版本(VisualStudio2008及更高版本)中,您可以将自动实现的属性与私有setter一起使用。这将使编译器为您创建支持字段。例如:

      public string ParameterName { get; private set; } 公共字符串参数名称{get;private set;}
    • 您正在将
      SetProperties
      方法声明为
      abstract
      。这应该是虚拟的<代码>抽象
意味着子类必须定义整个实现。这里不是这样

  • 在派生类中,可以重写
    SetValues
    ,但该方法称为
    SetProperties

  • 您正在将
    参数1
    声明为抽象。您不能实例化抽象类,因此您还必须从
    Parameter1
    继承一个类才能使用它。我猜您可能只想删除
    摘要
    限定符


  • 我可以看到您的代码存在四个问题:

  • 您正在重新定义3个共享属性,并尝试将它们命名为与现有字段相同的名称。这是不允许的。最简单的方法是在基类中实现属性,方法与在继承类中实现
    Value
    的方法相同:使用支持字段。在C#3.0及更高版本(VisualStudio2008及更高版本)中,您可以将自动实现的属性与私有setter一起使用。这将使编译器为您创建支持字段。例如:

    public string ParameterName { get; private set; } 公共字符串参数名称{get;private set;}
  • 您正在将
    SetProperties
    方法声明为
    abstract
    。这应该是虚拟的<代码>抽象
    意味着子类必须定义整个实现。这里不是这样

  • 在派生类中,可以重写
    SetValues
    ,但该方法称为
    SetProperties

  • 您正在将
    参数1
    声明为抽象。您不能实例化抽象类,因此您还必须从
    Parameter1
    继承一个类才能使用它。我猜您可能只想删除
    摘要
    限定符


  • 如前所述,不要想得太多。我将声明抽象参数类,以便它有一个构造函数(受保护),该构造函数接受必需的三个属性(Name、IsRequired和ID)。这意味着每个具体子类型都必须正确构造它

    然后,我将有一个抽象工厂方法,
    CreateInstance()
    ,每个具体的子类型都必须实现它,返回AbstractParameter的实例。为什么?仔细阅读这本书。当然,在现实世界中,与其说