簡體   English   中英

C#抽象類覆蓋方法

[英]C# Abstract Class Override method

使用C#.NET4.5和Visual Studio 2012 Ultimate。

我目前在我的標簽打印程序“我以前使用過的接口”中嘗試過抽象類。

我使用接口去分離了我的兩個班級,它很棒。

現在,我正在嘗試以下方法。

1號 我的抽象課...

abstract class Label
{

    public virtual IList<Microsoft.Reporting.WinForms.ReportParameter> NewReportSetup(string part, string batch, string locn, string wheel, string gear, string length,
                                string fits, string newbar, string newbarnum, string abs)
    {
        IList<Microsoft.Reporting.WinForms.ReportParameter> parameters = new List<Microsoft.Reporting.WinForms.ReportParameter>();
        parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramPart", part));
        parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramBatch", batch));
        parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramLocn", locn));
        parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramWheel", wheel));
        parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramGear", gear));
        parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramLength", length));
        parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramABS", abs));

        parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramBuyer", fits));
        parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramBarCode", newbar));
        parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramBartxt", newbarnum));

        return parameters;
    }
}

2號 我的ReportShaft繼承標簽...

class ReportShaft : Label
{
    public virtual IList<Microsoft.Reporting.WinForms.ReportParameter> NewReportSetup()
    {         
        return new List<Microsoft.Reporting.WinForms.ReportParameter>();
    }
}

第三名 我的表單實例化ReportShaft類並調用NewReportSetup()...

private void NewReportSetupSHAFT()
{           
    if(txtABS.Text.ToString() == "" || txtABS.Text == null)
    {
        txtABS.Text = "N/A";
    }

    IList<Microsoft.Reporting.WinForms.ReportParameter> param = new List<Microsoft.Reporting.WinForms.ReportParameter>();

    param = reportshaft.NewReportSetup(txtNewPart.Text.ToString(),
        txtBatch.Text.ToString(), txtLocation.Text.ToString(), txtWheel.Text.ToString(), txtGear.Text.ToString(), txtLength.Text.ToString(),
        txtFits.Text.ToString(), txtNewBar.Text.ToString(), txtNewBarNum.Text.ToString(), txtABS.Text.ToString());

    reportViewer1.LocalReport.SetParameters(param);                        
}

這很好用(盡管我感覺我以錯誤的方式使用Abstract類,不確定)。

我的問題是:

我想創建一個新的報告類。 我希望Class調用完全相同的方法,但讓我更改前2個參數名稱,並完全跳過最后一個

現在,這是否需要對該方法的補充 如果是這樣,怎么辦? Label方法是否需要從虛擬功能更改?

非常感謝你們!

更新::好的,當我提到參數時似乎有些混亂。

我的意思是說我希望從抽象類中調用1方法,然后在繼承該標簽類和方法的報告類中,我希望更改“報告參數”,即方法的主體。

這樣做的原因是因為如果我只是簡單地創建另一個方法並針對每個不同的報表調用該方法,則我將使用幾乎相同的方法。

繼承人的例子::改變這個。

parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramPart", part));

太..

parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramchanged!!", part));

這是一個例子。 因此,根據我收集的信息,我在報告類中覆蓋了我的標簽類方法。 但是隨后我陷入了困境,如果我嘗試更改主體,則必須鍵入與之配套的其余代碼。 對我來說,即時通訊仍然以一堆看起來相同的方法結束。

無論如何,是否有必要更改“方法主體的一部分”而不必鍵入其余部分。

希望這能消除混亂。

我不確定您在做什么是最好的方法。 我將重構代碼,以便NewReportSetup接受一個對象。 然后,您可以讓對象具有您要訪問的屬性,如果未設置它們,則不要使用它們。 然后,您可以創建一個構建器類。

 NewReportSetup(ReportProperties propertiesObject)
 {
      ...
 }

 public class ReportProperties
 {
     public String Part{get;set;}
     ...
 }

然后,您可以創建子類,以使用/格式化實現中指定的ReportProperties對象

否則,一個更直接的答案是米卡的,它也有效。 區別是組成比繼承之一 繼承有它的位置,但是當組合是更好的方法時,不應過度使用

為了您的更新

這聽起來像是您可以進行的更新(但是, ReportProperties對象仍然可以使用...您還可以使其包含所有元數據)

您的抽象類:

public virtual void NewReportSetup(params)
{
    ...
    parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramBatch", batch));
    ...
    FinalizeParameters(parameters, paramsThatAreImplSpecific);
}

protected abstract void FinalizeParameters(List, paramsThatAreImplSpecific);

您的具體實現:

protected override void FinalizeParameters(List, paramsThatAreImplSpecific)
{
    parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramPart or paramChanged", part));
}

現在,您可以使FinalizeParameters具有您可以重寫的根實現,但是您要小心打破Liskov的Substitution Principle 在我看來,確實確實應該通過適當的元數據使用ReportProperties對象,無論是通過字典還是其他機制。 但是,我想說如果您不想采用任何其他方式,則通過抽象方法強制添加最終參數是您的最佳選擇。

您想在基類中重載方法而不是重寫

覆蓋更改功能,而重載會更改簽名。 你可以這樣

class ReportShaft : Label
{
  public virtual IList<Microsoft.Reporting.WinForms.ReportParameter> NewReportSetup()
    {
   base.NewReportSetup("part", "batch", "locn", "wheel","gear", "length", "fits", "newbar",  "newbarnum", null)

}
}

如果您使用許多相同的參數或具有很多您調用的默認參數,這將很有幫助。 還要注意,我正在調用base,它將調用基類方法而不是我正在使用的類中的方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM