我正在对父类中声明和调用myFunc()
的代码进行更改,其中它被声明为abstract。它实际上是在派生类中实现的?我知道部分类具有此属性,其中定义可以拆分为多个文件 - 但是类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.
}
}
}
答案 0 :(得分:2)
继承和抽象类的概念与部分类完全分开。
当一个类标记为partial
时,这意味着在尝试编译该类时,它会查看项目中具有相同命名空间,相同类名的另一个类的所有代码文件,并且也标记为partial
。然后,它将这些定义中的代码组合到一个单独的类定义中。最终结果几乎与将每个部分类的文本复制/粘贴到一个类中的结果相同。
您实际上不需要具有多个部分类的实例。如果您将课程标记为partial
并且未提供其他部分实施,那么就好了。它不会是编译器错误。它只会将该类编译为该类的整个定义,就像partial
不存在时一样。
继承与该概念完全不同。当一个类被标记为abstract
时,它将被编译成它自己的类型,并且在编译的程序集中将存在该类型的定义(与它的所有实现分开)。
当你继承一个类(无论它是否是抽象的)时,它不会在编译时“组合”这些类。它们仍然是编译代码中存在的单独类型。对于每种类型,它将拥有自己的表,列出该类型的所有方法以及它的定义。对于每个派生类型的新方法,它将指向新类型中的定义。对于从基类继承而不被重写的方法,它将引用基类。对于在基类中定义但在派生类中重写的虚方法,它将指向派生类。使用它,它总能找到每种方法的实际实现。它在运行时尝试调用方法时执行此操作。
答案 1 :(得分:1)
这就是所谓的继承和多态。
当你知道必须要做某事时会使用它,但是'某事'的实现会根据正在执行的实例的类型而有所不同。
它没有违反任何规则。实际上,这种模式甚至有一个名称:Template method。
答案 2 :(得分:0)
你有一个额外的'}'在" protected abstract void myFunc();"之后,除了它看起来很好。 "部分"不会受伤,但它也不会发挥作用;它使您能够跨不同文件拆分相同类型的声明,但它不会对如何处理继承起作用。