在一个类中声明并在派生的分部类中实现的抽象方法



我正在对myFunc()在父类中声明和调用的代码进行更改,在父类中将其声明为抽象。它实际上是在派生类中实现的?我知道分部类具有这样的属性,其中定义可以在多个文件上拆分,但类A和B位于不同的名称空间中,并且都不使用关键字"partial"。

这个代码实现正确吗?还是违反了C#语言规则?

File1.cs

namespace PQR
{
public abstract class A : UserControl
{
protected abstract void myFunc(); //no definition because it is declared abstract
}
protected void use_myFunc(int i)
{
//call myFunc(). called in a parent class, 
//where it is declared abstract. And  
//it is actually implemented in the derived class???
myfunc();
}
} 

File2.cs

namespace ABC
{
public partial class B : PQR.A
{
protected override void myFunc() 
{
//do something.
}
}
}

继承类和抽象类的概念与分部类完全分离。

当一个类被标记为partial时,这意味着在尝试编译该类时,它将在您的所有代码文件中查找项目中具有相同命名空间、相同类名并且也被标记为partial的另一个类。然后,它将把这些定义中的代码组合成一个单独的类定义。最终结果几乎与您将每个分部类的文本复制/粘贴到一个类中一样。

实际上,您不需要拥有一个分部类的多个实例。如果您将一个类标记为partial,并且不提供额外的部分实现,那么就可以了。这不会是编译器错误。它只会将该类编译为该类的整个定义,就像不存在partial一样。

继承与这个概念是完全分离的。当一个类被标记为abstract时,它将被编译成自己的类型,并且该类型的定义将存在于编译的程序集中(与它的所有实现分开)。

当您从一个类继承时(无论它是否抽象),它都不会在编译时"组合"这些类。它们仍然是独立的类型,将存在于编译后的代码中。对于每个类型,它都有自己的表,该表列出了该类型的所有方法及其定义所在的位置。对于派生类型的每个新方法,它将在新类型中指向该定义。对于从基类继承而未重写的方法,它将引用基类。对于在基类中定义但在派生类中重写的虚拟方法,它将指向派生类。使用它,它总是可以找到每个方法的实际实现。当它尝试调用该方法时,它会在运行时执行此操作。

这就是所谓的继承和多态性。

当您知道必须执行某个操作,但"某个操作"的实现因执行实例的类型而异时,就会使用此选项。

它没有违反任何规则。事实上,这个模式甚至有一个名称:Template方法。

在"protected abstract void myFunc();"之后有一个额外的"}",但除此之外,它看起来还不错。"局部"不会有伤害,但也不会起作用;它使您能够在不同的文件中拆分相同类型的声明,但它对如何处理继承没有任何作用。

相关内容

最新更新