Questions tagged «abstract-class»

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

7
什么时候在C#中使用抽象类代替具有扩展方法的接口?
“抽象类”和“接口”是相似的概念,其中接口是两者中比较抽象的。一个区别因素是抽象类在需要时为派生类提供方法实现。但是,在C#中,最近引入的扩展方法已减小了这种差异因素,该扩展方法使得可以为接口方法提供实现。另一个区别因素是,一个类只能继承一个抽象类(即没有多重继承),但可以实现多个接口。这使接口的限制更少,更加灵活。因此,在C#中,什么时候应该使用抽象类而不是具有扩展方法的接口? 接口+扩展方法模型的一个著名示例是LINQ,其中为IEnumerable通过多种扩展方法实现的任何类型提供了查询功能。

9
为什么要将一个类声明为抽象类?
我知道应用于抽象类的语法,规则,并且想知道抽象类的用法 抽象类不能直接实例化,但可以被其他类扩展 这样做的好处是什么? 它与接口有何不同? 我知道一个类可以实现多个接口,但只能扩展一个抽象类。接口和抽象类之间的唯一区别是吗? 我知道接口的用法。我从Java中AWT的事件委托模型中学到了这一点。 在哪种情况下我应该将类声明为抽象类?那有什么好处?


2
纯抽象类和接口的实现
尽管在C ++标准中这不是强制性的,但例如,GCC似乎通过在每个相关类的实例中都包含指向该抽象类的v表的指针来实现父类(包括纯抽象类)的方式。 自然,这通过其具有的每个父类的指针使该类的每个实例的大小膨胀。 但是我注意到许多C#类和结构都有很多父接口,它们基本上是纯抽象类。如果对say的每个实例Decimal都充满了指向所有各种接口的6个指针,我会感到惊讶。 因此,如果C#确实使用不同的接口,至少在典型的实现中,它如何实现它们(我知道标准本身可能没有定义这种实现)?在将纯虚拟父代添加到类时,是否有任何C ++实现都可以避免对象大小膨胀?

4
使用C#中的抽象类作为定义
作为一名C ++开发人员,我已经习惯了C ++头文件,并发现在代码中包含某种强制性的“文档”很有用。通常,在这种情况下,我不得不读一些C#代码时会很糟糕:我没有正在使用的类的思维导图。 假设作为软件工程师,我正在设计程序的框架。将每个类都定义为抽象的未实现类是否太疯狂了,就像我们对C ++标头所做的那样,让开发人员实现它呢? 我猜可能有人可能会因为某些原因而认为这是一个糟糕的解决方案,但我不确定为什么。这样的解决方案必须考虑什么?

3
永远不要让公众成员虚拟/抽象-是吗?
早在2000年代,我的一位同事就告诉我,将公共方法虚拟化或抽象化是一种反模式。 例如,他认为这样的课程设计得不好: public abstract class PublicAbstractOrVirtual { public abstract void Method1(string argument); public virtual void Method2(string argument) { if (argument == null) throw new ArgumentNullException(nameof(argument)); // default implementation } } 他说 实现Method1并重写的派生类的开发人员Method2必须重复参数验证。 如果基类的开发人员决定在Method1或Method2以后的可自定义部分周围添加一些内容,他将无法执行。 相反,我的同事提出了这种方法: public abstract class ProtectedAbstractOrVirtual { public void Method1(string argument) { if (argument == null) throw new …

5
枚举会创建脆弱的接口吗?
考虑下面的示例。对ColorChoice枚举的任何更改都会影响所有IWindowColor子类。 枚举会导致界面脆弱吗?是否有比枚举更好的东西可以提供更多的多态灵活性? enum class ColorChoice { Blue = 0, Red = 1 }; class IWindowColor { public: ColorChoice getColor() const=0; void setColor( const ColorChoice value )=0; }; 编辑:很抱歉使用颜色作为我的示例,这不是问题所在。这是一个不同的示例,它避免出现红色鲱鱼,并提供有关灵活性的更多信息。 enum class CharacterType { orc = 0, elf = 1 }; class ISomethingThatNeedsToKnowWhatTypeOfCharacter { public: CharacterType getCharacterType() const; void setCharacterType( const CharacterType …

2
抽象异常超类型
如果System.Exception认为投掷很糟糕,为什么一开始就没有Exception做出abstract? 这样,将无法调用: throw new Exception("Error occurred."); 这将强制使用派生异常来提供有关发生的错误的更多详细信息。 例如,当我想为库提供自定义异常层次结构时,通常会为我的异常声明一个抽象基类: public abstract class CustomExceptionBase : Exception { /* some stuff here */ } 然后是一些派生的异常,其目的更加具体: public class DerivedCustomException : CustomExceptionBase { /* some more specific stuff here */ } 然后,在调用任何库方法时,可以使用此通用try / catch块直接捕获来自库的任何错误: try { /* library calls here */ } catch (CustomExceptionBase ex) …

4
何时将公共字段移入基类?
我目前有两个派生类A和B,它们都有一个共同的字段,并且我试图确定它是否应该进入基类。 永远不会从基类中引用它,并且说如果在将来的某个时刻派生出另一个没有的类C,那么它不会_field1违反“最低特权”(或某些东西)的原则。是吗 public abstract class Base { // Should _field1 be brought up to Base? //protected int Field1 { get; set; } } public class A : Base { private int _field1; } public class B : Base { private int _field1; } public class C : Base { // …

6
抽象类,接口和何时使用它们之间有什么区别
最近,我开始全神贯注于OOP,现在到了这样的地步,我越了解抽象类和接口之间的差异,就越会感到困惑。到目前为止,都无法实例化。接口或多或少是结构的蓝图,它们通过能够部分实现代码来确定骨架和摘要是否不同。 我想通过我的具体情况了解更多有关这些的信息。这是我第一个问题的链接,如果您需要更多背景信息:新班级的良好设计模型是什么? 这是我创建的两个类: class Ad { $title; $description $price; function get_data($website){ } function validate_price(){ } } class calendar_event { $title; $description $start_date; function get_data($website){ //guts } function validate_dates(){ //guts } } 因此,如您所见,这些类几乎是相同的。这里没有显示,但也有其他的功能,like get_zip(),save_to_database()跨越我的课是常见的。我还添加了其他类“汽车”和“宠物”,这些类具有所有常用方法,并且当然具有这些类的特定属性(例如,里程,重量)。 现在,我违反了DRY原则,并且正在多个文件中管理和更改相同的代码。我打算开设更多课程,例如船,马或其他。 那么这是我要使用接口或抽象类的地方吗?根据我对抽象类的了解,我将使用超类作为模板,并将所有常见元素内置到抽象类中,然后仅添加将来类中特别需要的项目。例如: abstract class content { $title; $description function get_data($website){ } function common_function2() { } function common_function3() …

6
我可以将接口方法视为抽象方法吗?
我正在考虑这一点,我对此有些怀疑。 当我声明一个接口时,例如: public interface MyInterface { public void method1(); public void method2(); } 这些接口方法可以被认为是抽象的吗?我的意思是抽象方法的概念是: 抽象方法是已声明但不包含任何实现的方法。 那么,可以将这些方法视为抽象方法吗?它们不是“纯”抽象方法,因为我没有使用这个abstract词,但从概念上讲,它们看起来像是。 您能告诉我些什么? 谢谢。

3
我应该直接实现接口还是让超类来实现?
两者之间有区别吗 public class A extends AbstractB implements C {...} 与... public class A extends AbstractB {...} abstract class AbstractB implements C {...} 我知道在两种情况下,类A最终都将符合该接口。在第二种情况下,AbstractB可以在中提供接口方法的实现C。那是唯一的区别吗? 如果我不想提供任何的接口方法的实现 AbstractB,我应该使用哪种风格?使用一个或另一个具有隐藏的“文档”目的吗?

5
为什么静态方法不能被重写?
在回答这个问题时,普遍的共识是静态方法不应被覆盖(因此C#中的静态函数不能是虚拟的或抽象的)。但是,不仅在C#中是这种情况。Java也禁止这样做,C ++也似乎不喜欢它。但是,我可以想到许多我想在子类中覆盖的静态函数示例(例如,工厂方法)。从理论上讲,有多种方法可以解决这些问题,但都不是干净或简单的方法。 为什么静态函数不应该被覆盖?

4
C ++和Java中的抽象类/接口是否有不同的用法依据
根据Herb Sutter的说法,应该更喜欢抽象接口(所有纯虚函数)而不是C ++中的抽象类,以尽可能地实现分离。虽然我个人认为该规则非常有用,但是最近我加入了一个由许多Java程序员组成的团队,并且在Java代码中似乎没有该准则。函数及其实现通常位于抽象类中。因此,即使对于C ++,我也将Herb Sutter弄错了吗?还是与Java相比,C ++中抽象函数的用法是否存在一般差异?在Java中,带有实现代码的抽象类比在C ++中更明智吗?如果是,为什么呢?

7
单例,抽象类和接口的作用是什么?
我正在学习C ++中的OOP,即使我知道这3个概念的定义,我也无法真正意识到何时或如何使用它。 让我们以此类为例: class Person{ private: string name; int age; public: Person(string p1, int p2){this->name=p1; this->age=p2;} ~Person(){} void set_name (string parameter){this->name=parameter;} void set_age (int parameter){this->age=parameter;} string get_name (){return this->name;} int get_age (){return this->age;} }; 1. 单身人士 类的限制如何只有一个对象起作用? CAN你设计一个类,将有只有 2个实例?也许3? 何时 /建议何时使用单例?这是好习惯吗? 2. 抽象类 据我所知,如果只有一个纯虚函数,则该类将变为抽象。因此,添加 virtual void print ()=0; 会做到的,对吧? 为什么需要一个不需要其对象的类? …

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.