抽象类不能启动,那么为什么允许将可替换类替换为派生类呢?



我有抽象类和普通类。 从抽象类继承的普通类。

见下文

public abstract class ABParent
{
public void Add()
{
}
}
public class Derived : ABParent
{
public void Show()
{
}
}

这里抽象类不能实例化。换句话说,我们不能为抽象类创建对象。

请参阅下面的代码

ABParent objABParent = new Derived();

从上面的代码中,objABParent就像抽象类的实例一样,我们只能使用objABParent访问抽象类中的所有元素。

所以我的疑问是它如何作为抽象类的实例工作?

在类声明中使用抽象修饰符来指示类仅是其他类的基类,而不是单独实例化。标记为抽象的成员必须由派生自抽象类的非抽象类实现。 抽象关键字使您能够创建不完整且必须在派生类中实现的类和类成员。

https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/abstract

https://learn.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/abstract-and-sealed-classes-and-class-members

如果要创建必须在派生类中实现的类成员,可以执行以下操作:

public abstract class ABParent
{
public abstract void Add();
}
public class Derived : ABParent
{
public void Add(){ }
public void Show(){ }
}

在您的情况下,您可以调用基类的方法,因为此方法是在基类中实现的。 您可以使用virtual方法。当抽象类从基类继承虚拟方法时,抽象类可以重写虚拟方法。

假设你想要一个不全是Derived的对象集合,但你只想在其中Add()东西,就像在ABParent中完成的那样。 现在你要做的是将它们添加到摘要列表中,然后你可以把它们全部删除:

List<ABParent> classesThatAdd()
{
new DerivedA(),
new Derivedb(), 
new Derived(), 
new Derived()
};
foreach (var item in classesThatAdd)
{
item.Add(new object());
}

不是所有的派生类(DerivedADerivedB(都需要有Show(),但它们都有Add()

最新更新