我真的不知道有什么好看还是当我真正的抽象类和属性,或当使用非抽象的性质使用。 我会尽力做一个简单的例子。 比方说,我有这样的:
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
}
这是好吗? 我的理解,我没有用一个抽象的财产,如果我不想覆盖它。 而在这种情况下,这将是确定,只是方法,如Speak
, Sleep
等等应该是抽象的。
现在,如果这是确定的,当会或者我应该使用抽象的财产?
当你没有默认的实现和派生类时必须实现它使用抽象属性。
当你在基类的实现,但要允许压倒一切的使用虚拟财产。
使用override
关键字重写成员。 标记成员作为sealed override
,如果它不应该被重新改写。
不标记属性作为abstract
或virtual
,如果你不希望它被覆盖做。
使用new
的关键字隐藏非抽象,非虚成员(这很少有一个好主意)。
如何:定义抽象属性
我发现,抽象属性经常发生在这意味着它们将具有特定类型的逻辑和/或副作用的设计。 你基本上是说,“这里是所有子类必须有一个数据点,但我不知道如何实现它。” 然而 ,含有大量的逻辑和/或引起副作用性能可能不是期望的。 这是一个重要的考虑因素,但没有固定的正确/错误的方式来做到这一点。
看到:
就个人而言,我发现我经常使用的抽象方法,但抽象属性很少。
我知道我希望他们做,我不在乎他们是如何做到这一点:接口。
我知道我希望他们做,我不在乎他们怎么做了一些,但我已经对公司的想法如何,他们会(或至少大多数)做其他位:抽象类。
我知道我希望他们做什么,以及如何大多会做到这一点:虚拟成员具体类。
你可以有其他的情况下,如没有抽象成员如抽象类(你不能有一个实例,但它提供了什么功能,它完全提供),但他们是罕见的,通常进展,是因为特定的层次结构本身提供干净,公然给定的问题。
(顺便说一句,我不认为一个彼得的作为一种人类的,但每个彼得作为谁碰巧被称为彼得人类的一个实例。这不是一个真正公平的示例代码挑这样,但是当你”重新思考这种问题,它比平常更贴切)。
抽象成员,你必须重写只是虚拟的成员。 你用这个东西,必须要实现的,但不能在基类来实现。
如果你想使一个虚拟的财产,并希望,它在继承你的类的类被否决,那么你会使其成为一个抽象属性。
比如你有一个动物类,它的呼吸能力将不可能从它的动物的信息只是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; } }
}
使用抽象的,当所有的子类必须实现的方法/属性。 如果没有必要为每一个子类来实现它,那么就不要使用它。
至于你的榜样,如果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
抽象是正确的,因为每一辆汽车都有一个制造商,需要能够分辨出谁是制造者是用户。
一个抽象的财产将被用来在您想要的类总是暴露的财产,但如果你不能拖住该属性的implemetation - 留给了/迫使继承类这样做。
这里有一个例子在这里 ,这里的抽象类被命名为Shape
,它暴露了一个抽象的Area
属性。 你可以不执行Area
的基类属性,为区域内的公式将每个类型的形状改变。 所有形状有(某种)的区域,所以所有的形状应公开财产。
你的实现本身看起来就好了。 试图思考抽象属性为的明智例子的Human
,但也想不出什么合理。