不知道什么时候使用抽象属性,何时不(Not sure when to use an abstract

2019-06-27 18:30发布

我真的不知道有什么好看还是当我真正的抽象类和属性,或当使用非抽象的性质使用。 我会尽力做一个简单的例子。 比方说,我有这样的:

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等等应该是抽象的。

现在,如果这是确定的,当会或者我应该使用抽象的财产?

Answer 1:

当你没有默认的实现和派生类时必须实现它使用抽象属性。

当你在基类的实现,但要允许压倒一切的使用虚拟财产。

使用override关键字重写成员。 标记成员作为sealed override ,如果它不应该被重新改写。

不标记属性作为abstractvirtual ,如果你不希望它被覆盖做。

使用new的关键字隐藏非抽象,非虚成员(这很少有一个好主意)。

如何:定义抽象属性

我发现,抽象属性经常发生在这意味着它们将具有特定类型的逻辑和/或副作用的设计。 你基本上是说,“这里是所有子类必须有一个数据点,但我不知道如何实现它。” 然而 ,含有大量的逻辑和/或引起副作用性能可能不是期望的。 这是一个重要的考虑因素,但没有固定的正确/错误的方式来做到这一点。

看到:

  • 如若属性有副作用
  • CA1024:使用性质酌情

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



Answer 2:

我知道我希望他们做,我不在乎他们是如何做到这一点:接口。

我知道我希望他们做,我不在乎他们怎么做了一些,但我已经对公司的想法如何,他们会(或至少大多数)做其他位:抽象类。

我知道我希望他们做什么,以及如何大多会做到这一点:虚拟成员具体类。

你可以有其他的情况下,如没有抽象成员如抽象类(你不能有一个实例,但它提供了什么功能,它完全提供),但他们是罕见的,通常进展,是因为特定的层次结构本身提供干净,公然给定的问题。

(顺便说一句,我不认为一个彼得的作为一种人类的,但每个彼得作为谁碰巧被称为彼得人类的一个实例。这不是一个真正公平的示例代码挑这样,但是当你”重新思考这种问题,它比平常更贴切)。



Answer 3:

抽象成员,你必须重写只是虚拟的成员。 你用这个东西,必须要实现的,但不能在基类来实现。

如果你想使一个虚拟的财产,并希望,它在继承你的类的类被否决,那么你会使其成为一个抽象属性。

比如你有一个动物类,它的呼吸能力将不可能从它的动物的信息只是detemine,但它的东西,这是非常重要的:

public abstract class Animal {

  public abstract bool CanBreathe { get; }

}

对于鱼和狗的实现将是不同的:

public class Dog : Animal {

   public override bool CanBreathe { get { return !IsUnderWater; } }

}

public class Fish : Animal {

   public override bool CanBreathe { get { return IsUnderWater; } }

}


Answer 4:

使用抽象的,当所有的子类必须实现的方法/属性。 如果没有必要为每一个子类来实现它,那么就不要使用它。

至于你的榜样,如果SecondName不要求每个人,那么就没有必要在基类抽象属性。 如果在另一方面,每个人确实需要第二个名字,然后使它抽象属性。

抽象属性的正确使用示例:

public class Car
{
    public abstract string Manufacturer { get; }
}

public class Odyssey : Car
{
    public override string Manufacturer
    {
         get 
         {
             return "Honda";
         }
    }
}

public class Camry : Car
{
    public override string Manufacturer
    {
         get 
         {
             return "Toyota";
         }
    }
}

制作Maker抽象是正确的,因为一辆汽车都有一个制造商,需要能够分辨出谁是制造者是用户。



Answer 5:

一个抽象的财产将被用来在您想要的类总是暴露的财产,但如果你不能拖住该属性的implemetation - 留给了/迫使继承类这样做。

这里有一个例子在这里 ,这里的抽象类被命名为Shape ,它暴露了一个抽象的Area属性。 你可以不执行Area的基类属性,为区域内的公式将每个类型的形状改变。 所有形状有(某种)的区域,所以所有的形状应公开财产。

你的实现本身看起来就好了。 试图思考抽象属性为的明智例子的Human ,但也想不出什么合理。



文章来源: Not sure when to use an abstract property and when not