Questions tagged «abstract-class»

抽象类是无法实例化的类。它们通常是扩展类/子类,并且通常具有必须由子类实现的“抽象方法”。

5
如果我已经有一个抽象类,定义一个接口是否有意义?
我有一类带有一些默认/共享功能的类。我用abstract class它: public interface ITypeNameMapper { string Map(TypeDefinition typeDefinition); } public abstract class TypeNameMapper : ITypeNameMapper { public virtual string Map(TypeDefinition typeDefinition) { if (typeDefinition is ClassDefinition classDefinition) { return Map(classDefinition); } ... throw new ArgumentOutOfRangeException(nameof(typeDefinition)); } protected abstract string Map(ClassDefinition classDefinition); } 如您所见,我也有接口ITypeNameMapper。如果我已经有一个抽象类,TypeNameMapper或者abstract class已经足够,定义这个接口是否有意义? TypeDefinition 在这个最小的例子中也是抽象的。

5
是否应该将抽象类中的所有公共方法标记为虚拟?
最近,我不得不在正在使用的某些OSS上更新抽象基类,以便通过将它们虚拟化来使其更具可测试性(我不能使用将两个接口组合在一起的接口)。这让我开始思考是否应该标记我需要虚拟的所有方法,还是应该标记每个公共方法/属性都是虚拟的。我通常同意Roy Osherove的观点,即每种方法都应该虚拟化,但是我遇到了这篇文章,使我开始思考是否需要这样做。为了简单起见,我将限于抽象类,但是(我确定所有具体的公共方法都应该是虚拟的都是值得商de的)。 我可以看到您可能希望在哪里允许子类使用方法,而不希望它覆盖实现。但是,只要您相信将遵循Liskov的替代原则,那为什么不容许它被取代呢?通过将其标记为抽象,无论如何都在强制某种重写,因此,在我看来,抽象类内部的所有公共方法都应确实标记为虚拟。 但是,我想问一下是否有我可能没有想到的事情。应该将抽象类中的所有公共方法设为虚拟吗?

6
抽象类应包含哪些代码?
最近,我对抽象类的使用感到困扰。 有时,会预先创建一个抽象类,并将其作为派生类工作方式的模板。这意味着或多或少地,它们提供了一些高级功能,但是遗漏了某些细节要由派生类实现。抽象类通过放置一些抽象方法来定义对这些细节的需求。在这种情况下,抽象类的工作原理类似于蓝图,功能的高级描述或您想要的任何名称。它不能单独使用,而必须专门用于定义高层实现中遗漏的细节。 在另一些时候,碰巧抽象类是在创建一些“派生”类之后创建的(由于父/抽象类还不存在,所以还没有派生出来,但是您知道我的意思)。在这些情况下,抽象类通常用作放置当前派生类所包含的任何常见代码的地方。 做出上述观察后,我想知道这两个案例中的哪一个应该成为规则。是否应该仅由于它们当前在所有派生类中都是通用的,而将某种细节冒充到抽象类?是否应该存在不属于高级功能的通用代码? 对于抽象类本身可能没有意义的代码是否应该仅仅因为它对派生类是通用的而存在呢? 让我举个例子:抽象类A有一个方法a()和一个抽象方法aq()。在派生类AB和AC中,方法aq()都使用方法b()。b()应该移到A吗?如果是的话,那么如果有人只看着A(假装AB和AC不在那儿),那么b()的存在就没有多大意义了!这是坏事吗?有人应该能够在不访问派生类的情况下浏览抽象类并了解发生了什么吗? 老实说,在提出这个问题时,我倾向于认为编写一个有意义的抽象类而不必查看派生类是一个干净的代码和干净的体系结构的问题。我真的不喜欢抽象类的想法,它像所有代码的转储一样在所有派生类中都很常见。 您如何看待/实践?

3
基类中的抽象属性,强制程序员对其进行定义
我正在使用嵌入式设备的状态模式进行编码。我有一个称为State的基类/抽象类,然后每个离散(具体)状态类都实现了抽象State类。 在状态类中,我有几种抽象方法。如果我不在离散(具体)类中实现抽象方法,Visual Studio将给出如下错误: ...错误1'myConcreteState'未实现继承的抽象成员'myAbstractState' 现在:我正在尝试为每个名为StateName的州创建String属性。每当创建新的具体类时,都需要定义StateName。如果不使用VS,我希望VS抛出错误。有没有简单的方法可以做到这一点? 我已经在抽象/基类中尝试过此操作: public abstract string StateName { get; set; } 但是我不需要在每个州中实现Get和Set方法。 修订的问题:在理想情况下,将要求每个状态类都具有StateName定义并从抽象基类继承。 StateName = "MyState1"; //or whatever the state's name is 如果缺少该语句,则Visual Studio将生成如上所述的错误。这可能吗?如果可以,怎么办?

3
抽象基类和副本构造,经验法则
通常,最好有一个抽象基类来隔离对象的接口。 问题在于,默认情况下,C ++中的副本构造IMHO在很大程度上已被破坏,默认情况下会生成副本构造函数。 那么,当您有一个抽象基类和派生类中的原始指针时,会遇到什么陷阱? class IAbstract { ~IAbstract() = 0; } class Derived : public IAbstract { char *theProblem; ... } IAbstract *a1 = new Derived(); IAbstract a2 = *a1;//??? 现在,您是否彻底禁用了整个层次结构的副本构建?将副本构造声明为私有IAbstract? 抽象基类是否有三分法则?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.