我们知道如果一个类有抽象方法,它将是抽象的。它无法获得实例。但为什么可以有实例方法呢?它有什么意义吗?
public abstract class AbsClass
{
public abstract void GetA();
public void Getb()
{ }
}
答案 0 :(得分:2)
并非抽象类中的每个方法都必须是抽象的 - 当您从类派生时,派生类将从基类继承非抽象方法。想要在基类中提供所有派生类通用的功能是非常常见的(实际上,将共享功能拉到基类以避免在各种派生类中重复代码是一种很好的编程习惯)。想要在基类中提供“默认”功能也是非常常见的,然后可以被各个派生类覆盖。
无法实例化基类本身并不重要 - 基类中的非抽象方法在(非抽象)派生类的实例上调用。
答案 1 :(得分:2)
是的,它有意义。
它可以在任何未明确实现它的派生类中使用。
派生类的示例:
public abstract class AbsClass
{
public abstract void GetA();
public void Getb()
{ }
}
public class DerivedClass : AbsClass
{
}
以下代码将执行抽象类的Getb()代码:
var derivedClass = new DerivedClass();
derivedClass.Getb();
(请注意,在上面的示例中,代码不会编译,除非您的派生类实现了GetA(),因为它被声明为abstract,因此必须在任何具体的派生类中实现)
答案 2 :(得分:1)
该方法将是从AbsClass
派生的具体类的实现。抽象意味着你不能创建类的实例,而不是它不能有任何实现方法。您还可以在抽象类中包含实例数据成员。
举个例子:
public class MyAbsClass : AbsClass
{
}
MyAbsClass mine = new MyAbsClass();
mine.Getb(); //This would call the implementation in AbsClass
如果AbsClass
是interface
,则不允许实施。
答案 3 :(得分:1)
是的,它的定义非常明确。在你有一个实例之前不能调用,这反过来表明你必须有一个具体的子类型,但是一旦你做到这个方法就完全可用了,例如:
AbsClass foo = new ConcreteClass();
foo.Getb();
或者确实:
ConcreteClass foo = new ConcreteClass();
foo.Getb();
(因为子类型继承了在基类型上定义的任何类型)
这些方法很常见,他们自己使用该类型的abstract
或virtual
方法 - 或者确实是virtual
。