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

时间:2012-11-21 21:00:00

标签: c#

我正在对父类中声明和调用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.
       }
    }
}

3 个答案:

答案 0 :(得分:2)

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

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

您实际上不需要具有多个部分类的实例。如果您将课程标记为partial并且未提供其他部分实施,那么就好了。它不会是编译器错误。它只会将该类编译为该类的整个定义,就像partial不存在时一样。

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

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

答案 1 :(得分:1)

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

当你知道必须要做某事时会使用它,但是'某事'的实现会根据正在执行的实例的类型而有所不同。

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

答案 2 :(得分:0)

你有一个额外的'}'在" protected abstract void myFunc();"之后,除了它看起来很好。 "部分"不会受伤,但它也不会发挥作用;它使您能够跨不同文件拆分相同类型的声明,但它不会对如何处理继承起作用。