2012-11-21 63 views
0

我正在對代碼進行更改,其中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. 
     } 
    } 
} 
+3

如果您想知道代碼是否會編譯,建議您將代碼輸入到visual studio中,或者直接調用編譯器,然後查看自己的結果。如果編譯,你不需要我們告訴你。 – Servy

+0

是的,對。違規,沒有。 –

+0

我不會打擾發佈一個答案,因爲你的代碼在語義上看起來是正確的。 – code4life

回答

1

這就是所謂的繼承和多態。

當您知道必須完成某些操作時纔會使用此功能,但是,「某事」的實現因正在執行的實例的類型而異。

它沒有違反任何規則。實際上,這種模式甚至有一個名字:Template method

+0

這並不回答他問的問題。 – Servy

+0

+1來抵消-1:我認爲它很好地回答了這個問題。 – code4life

+0

@ code4life'「這段代碼是否正確實現?還是違反了C#語言規則?」「這並不能回答這個問題。它給出了它在做什麼的名字,但沒有說明這是一個好還是壞的事情。它也沒有回答它是否會編譯的問題(它不會)。 – Servy

0

在「protected abstract void myFunc();」之後有一個額外的'}',但除此之外它看起來不錯。 「偏」不會傷害,但也不會起作用;它使您能夠將相同類型的聲明拆分到不同的文件中,但它對於如何處理繼承沒有任何作用。

+0

'myFunc'的方法調用沒有正確的外殼,所以也不能編譯。另外'use_myFunc'沒有在任何類中定義,所以不會被編譯。 – Servy

+0

@Servy我注意到方法的奇怪位置,但認爲它是錯位的'}'。沒有注意到套管錯誤,但我理解這個問題更像是'爲什麼不編譯'這個概念。 – fsimonazzi

+0

將代碼複製粘貼到Visual Studio中非常簡單。爲什麼只是看看並猜測什麼時候可以讓C#編譯器告訴你*某些*是否會編譯,如果不是,爲什麼。 – Servy

2

繼承和抽象類的概念完全獨立於部分類。

當一個類被標記爲partial這意味着當它試圖編譯該類時,將通過所有代碼文件查找項目中具有相同名稱空間,相同類名稱的另一個類,並且也標記爲partial。然後它將把這些定義中的代碼合併成一個類定義。最終結果幾乎相同,如果您將每個部分類的文本複製/粘貼到一個類中。

實際上你不需要有多個部分類的實例。如果您將一個類標記爲partial並且不提供其他部分實現,那麼這就是就好了。它不會是一個編譯器錯誤。它只會將該類作爲該類的完整定義進行編譯,就像partial不存在時一樣。

繼承與該概念完全分離。當一個類被標記爲abstract時,它將被編譯成它自己的類型,並且該類型的定義將在編譯的程序集中存在(與它的所有實現分開)。

當你從一個類繼承(不管它是否抽象),它不會在編譯時「結合」這些類。它們仍然是編譯代碼中存在的獨立類型。對於每種類型,它都有自己的表格,列出了該類型的所有方法以及其定義的位置。對於每個派生類型的新方法,它將指向新類型中的那個定義。對於從基類繼承而未重寫的方法,它將引用基類。對於在基類中定義但在派生類中被重寫的虛方法,它將指向派生類。使用它可以隨時查找每種方法的實際執行情況。它在運行時正確地嘗試調用該方法。

相關問題