我刚刚开始使用抽象类,但我对抽象类中抽象属性的使用有点疑惑。
为什么要在已经抽象的类中抽象属性?无论是否抽象,该属性都将被公开。在什么情况下将抽象类中的属性抽象化是有利的?
也许有点愚蠢/基本的问题,但到目前为止我还没有遇到过我对自己说“呃这个确切的属性应该在这个抽象类中是抽象的”的情况。
考虑这个例子.. 你会把任何属性抽象化吗?为什么?
public abstract class BaseError
{
public string Title { get; set; } = "";
public string Description { get; set; } = "";
public Exception Exception { get; set; }
private DateTime CreatedDateTime { get; set; } = DateTime.Now;
public BaseError()
{
}
}
需要注意的是你没有abstract properties在这个例子中。这些是 auto properties ;他们有一个隐藏的支持领域。
抽象属性
属性是 get 和 set 方法的复合体,它们不需要简单地通过设置和读取支持字段来实现。
派生类可能决定向属性添加验证,将其存储在支持字段以外的其他内容中,在属性更改值时添加事件,将其实现为常量,抛出异常等。
要定义抽象属性,请遵循以下示例:
public abstract double x
{
get;
set;
}
注意 abstract
关键字。
使用抽象属性强制派生类使用override
关键字提供实现。
自动属性
自动属性是使用隐藏的支持字段实现的属性。与抽象属性类似,它们没有 getter 或 setter 主体。
根据您的示例,这是一个自动属性:
public string Title { get; set; } = "";
在这里,编译器将生成一个隐藏的支持字段来存储属性的值,并在构造时(创建类的对象时)将其设置为""
。
自动属性,比公共(public)字段有优势。特别是如果 future 的实现需要更改属性的行为,他们可以在不更改类的接口(interface)的情况下这样做。
推荐阅读:Properties vs. Public Variables