c# - 抽象类中的抽象属性。重点是什么?

标签 c# inheritance abstract-class

<分区>

我刚刚开始使用抽象类,但我对抽象类中抽象属性的使用有点疑惑。 为什么要在已经抽象的类中抽象属性?无论是否抽象,该属性都将被公开。在什么情况下将抽象类中的属性抽象化是有利的? 也许有点愚蠢/基本的问题,但到目前为止我还没有遇到过我对自己说“呃这个确切的属性应该在这个抽象类中是抽象的”的情况。

考虑这个例子.. 你会把任何属性抽象化吗?为什么?

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

关于c# - 抽象类中的抽象属性。重点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39995918/

相关文章:

c# - 用c#泛型继承,而继承类类型

c++ - 不确定在尝试扩展我的堆栈功能时是否使用继承

c# - 继承一个没有任何构造函数的抽象类

java - 如果公共(public)成员访问私有(private)成员,则不继承私有(private)成员

Delphi接口(interface)继承: Why can't I access ancestor interface's members?

java - 需要弄清楚类抽象

java - 有没有办法从抽象类的具体方法访问具体类变量值

c# - 使用表达式树构建 LINQ GroupBy 查询

c# - SmtpClient 发送原始 Html

c# - 显式使用扩展方法