c# - 不确定何时使用抽象属性,何时不使用

标签 c# .net oop properties abstract

我不太确定什么看起来更好,或者我什么时候真正在抽象类和属性中使用,或者什么时候使用非抽象属性。我将尝试举一个简单的例子。假设我有这个:

abstract class Human
{
  public GenderType Gender { get; set; }
  public string Name { get; set; }
  public Date Born { get; set; }
  public bool IsNerd { get; set; }

  abstract public void Speak();
  abstract public void Sleep();
  abstract public void AnoyingPeopleOnStackOverflow();
  //... so on
}

class Peter : Human
{
  //Peter is special, he got a second name
  //But thats all, everything else is the same as like on other humans
  public string SecondName { get; set; }

  //...override abstract stuff
}

这样可以吗?据我了解,如果我不想覆盖抽象属性,则不必使用它。在这种情况下就可以了,只是 SpeakSleep 等方法应该是抽象的。

现在,如果没问题,我什么时候会或应该使用抽象属性?

最佳答案

当您没有默认实现并且派生类必须实现它时,请使用抽象属性。

当您在基类中有一个实现但希望允许覆盖时,请使用虚拟属性。

使用override 关键字来覆盖一个成员。如果不应再次覆盖该成员,则将该成员标记为密封覆盖

如果您不希望该属性被覆盖,请不要将该属性标记为abstractvirtual

使用 new 关键字来隐藏非抽象、非虚拟成员(这很少是个好主意)。

How to: Define Abstract Properties

我发现抽象属性经常出现在设计中,这意味着它们将具有特定于类型的逻辑和/或副作用。你基本上是在说,“这是一个所有子类都必须有的数据点,但我不知道如何实现它”。 但是,包含大量逻辑和/或导致副作用的属性可能并不理想。这是一个重要的考虑因素,尽管没有固定的正确/错误方法。

参见:

就我个人而言,我发现我经常使用抽象方法,但很少使用抽象属性。

关于c# - 不确定何时使用抽象属性,何时不使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12254438/

相关文章:

c# - ASP.Net 从文本框插入数据到数据库

.net - 使用 “SQL”查询Active Directory?

.net - CultureInfo.CurrentCulture 可以为空吗?

java - 调用 Object 类的 wait() 方法时出现异常

c# - 如何对 ArgumentNullException 的重载构造函数进行单元测试,其中每个构造函数只有一个参数

c# - 事件目录 - 以编程方式检查提供的凭据

c# - SQL Server CE 或 Access for a portable database with c#?

c# - C# 在同一个套接字上发送+接收数据

java - 如何有效地从服务中调用 Spring 存储库方法?

c++ - 重载赋值运算符,rhs是函数调用