C# C语言中的抽象类和方法#
我想为应用程序中要继承的所有参数类型类创建一个抽象基类。所有参数都将具有名称、ID和必需的属性 所有参数都将通过SetProperties方法从XML设置其属性(下面显示的XmlParser类仅用于演示) 由于所有参数都具有相同的3个属性,我希望基类设置这些属性,但让继承类扩展SetProperties方法以设置它包含的其他属性 我想在C# C语言中的抽象类和方法#,c#,inheritance,abstract-class,C#,Inheritance,Abstract Class,我想为应用程序中要继承的所有参数类型类创建一个抽象基类。所有参数都将具有名称、ID和必需的属性 所有参数都将通过SetProperties方法从XML设置其属性(下面显示的XmlParser类仅用于演示) 由于所有参数都具有相同的3个属性,我希望基类设置这些属性,但让继承类扩展SetProperties方法以设置它包含的其他属性 我想在控件上重写事件 这是我所想的一个例子,尽管它不起作用 abstract class ParameterBase { protected string Pa
控件上重写事件
这是我所想的一个例子,尽管它不起作用
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
继承一个类才能使用它。我猜您可能只想删除摘要限定符
我可以看到您的代码存在四个问题:
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的实例。为什么?仔细阅读这本书。当然,在现实世界中,与其说