0

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

我目前正在尝试使用我的标签打印程序 Ive Used Interfaces 之前的抽象类。

我使用接口来解耦我的两个类,效果很好。

现在我尝试以下。

第一个。我的抽象类...

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;
    }
}

第二。我的 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);                        
}

这很好用(虽然我觉得我以错误的方式使用抽象类,不确定)。

我的问题是:

我想创建一个新的报告类。我希望类调用相同的方法,但允许我更改前 2 个参数名称,并完全跳过最后一个

现在这需要覆盖该方法吗?如果是这样,人们将如何做到这一点?Label 方法是否需要从Virtual Function更改?

非常感谢伙计们!

更新::当我提到参数时,好的似乎有些混乱。

我的意思是说我希望从我的抽象类中调用 1 方法,然后在我继承此标签类和方法的报告类中,我希望更改“报告参数”,我的意思是方法的主体。

这样做的原因是因为如果我简单地创建另一个方法并为每个不同的报告调用它,我将使用几乎相同的方法。

继承人的例子::改变这个..

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

太这了。。

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

这是一个例子。所以从我收集到的信息中,我在我的报告类中覆盖了我的标签类方法。但是后来我卡住了,如果我尝试更改正文,我必须输入其余的代码。对我来说,我仍然会得到一堆看起来相同的方法。

无论如何都可以更改“方法主体的部分部分”而不必输入其余部分。

希望这能消除混乱。

4

2 回答 2

2

我不确定你在做什么是最好的方法。我会重构代码,以便NewReportSetup获取一个对象。然后,您可以让对象具有您可以访问的属性,如果没有设置它们,那么您就不要使用它们。然后,您可以创建一个构建器类。

 NewReportSetup(ReportProperties propertiesObject)
 {
      ...
 }

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

然后,您可以创建使用/格式化ReportProperties实现指定的给定对象的子类

否则,更直接的答案是 Micah 的,它也有效。不同之处在于Composition over Inheritance之一。继承有它的位置,但当组合是更好的方法时不应该过度使用

为了您的更新

这听起来像是您可以为更新做的事情(但是,该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 的替换原则。在我看来,您确实应该使用ReportProperties具有适当元数据的对象,无论是通过字典还是其他机制。但是,如果您不想采用任何其他方式,我会说通过抽象方法强制添加最终参数是您的最佳选择。

于 2012-11-20T16:16:26.560 回答
1

您要重载基类中的方法而不是override

覆盖更改功能,其中重载会更改签名。你可以这样做

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

}
}

如果您使用很多相同的参数或有一个您经常调用的默认参数,这将很有帮助。另请注意,我正在调用 base ,它将调用基类方法而不是我正在使用的类中的方法

于 2012-11-20T16:16:09.880 回答