“抽象类”与“普通班”的可重用库
-
25-09-2019 - |
题
我正在开发一个可重复使用的库,并已创建抽象类,因此客户端可然后从这些延伸。
问:是否有其实我应该在这里使用一个抽象类,而不是只是一个普通的类中的任何原因
请注意 - 已经决定,我不想使用接口,因为我想在我的图书馆实际的默认方法,因此使用它的客户端没有写代码
。编辑:所以我捞我想不出任何优势。例如升级,库将使用抽象类的减少对客户端代码的影响时 - 我看不出它会在这种情况下,不是吗?
解决方案
除非你想迫使终端用户继承你的类,应该没有理由使用的摘要的。
如果你想使你的类继承和易于扩展,使用的虚拟的上你的方法,并确保您有可用的保护的构造。
其他提示
为抽象类的动机是为要求客户端覆盖类。你对类是否应该是抽象的或不决定主要取决于是否抽象缺少一些基本的行为,只有类的用户可以提供。
您通常可以告诉你,需要你的类,如果你使用某种形式的,其中“插件在这种行为中洞”完成他类的逻辑的模板方法是抽象的。如果您的类是没有一些用户提供的逻辑非常有用,你可能并不需要的类是抽象的。
作为一个实例,框架通常不能在之类的东西对象状态验证,印刷,显示的术语代表他们的用户的决定,等等,并且它们会被客户端需要推迟到具体实现。
听起来像你感到困惑的虚拟方法和一个抽象类之间的差了一些。你并不需要你的类为抽象的,除非你确定它没有意义在它自己的。这是在你可能有多个类之间共享的行为方面是有用的。
听起来好像你只需要一个普通类和一些方法是虚拟的。
一个抽象类和非抽象一个之间的区别是,你不能实例前者的并且必须被重写。这确实是由你来确定基类的实例是否不使自身的意义。
让我告诉你两种情况。一种是其中抽象类有意义和一个其中它不
public abstract class Animal {
public string Name {get;set;}
}
public class Dog : Animal {
public Bark(){}
}
public class Cat : Animal {
public Meaow(){}
}
在这种情况下,我们有一个共同的基Animal
对于Name
属性提供实现。它本身是没有意义的实例化的动物,因为有世界上没有任何动物都只是动物,因为它们枯萎狗或猫或别的东西。
下面是其中是有意义的具有非抽象基的情况。
class Path {
public Path(IList<Point> points) {
this.Points = new ReadOnlyCollection<Point>(points);
}
public ReadOnlyCollection<Point> Points {get;}
}
class RectanglePath : Path{
public SquarePath (Point origin, int height, int width) :
base(new List<Point>{origin, new Point(origin.X + width, point.Y}, ....){
}
}
下面是不子类是有道理的道路上,我们可以创建任意形状,但它可能是使用sublass更具体的形状更方便。