0

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

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

文件1.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();
    }
} 

文件2.cs

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

3 回答 3

2

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

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

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

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

当您从一个类(无论它是否是抽象的)继承时,它不会在编译时“组合”这些类。它们仍然是存在于已编译代码中的单独类型。对于每种类型,它都有自己的表,其中列出了该类型的所有方法以及它的定义在哪里。对于每个派生类型的新方法,它将指向新类型中的定义。对于从基类继承且未被覆盖的方法,它将引用基类。对于在基类中定义但在派生类中被覆盖的虚方法,它将指向派生类。使用它,它总能找到每个方法的实际实现。当它尝试调用该方法时,它会在运行时执行此操作。

于 2012-11-21T21:29:00.967 回答
1

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

当您知道必须做某事时使用此选项,但该“某事”的实现取决于正在执行的实例的类型。

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

于 2012-11-21T21:05:03.847 回答
0

在“protected abstract void myFunc();”之后有一个额外的 '}',但除此之外它看起来还不错。“部分”不会有伤害,但也不会发挥作用;它使您能够将同一类型的声明拆分到不同的文件中,但它不会影响如何处理继承。

于 2012-11-21T21:05:40.590 回答