使用C#.NET4.5和Visual Studio 2012 Ultimate。
我目前正在尝试使用我的标签打印程序,以前的Ive Used Interfaces。
我使用Interfaces来解析我的两个班级,它运作得很好。
现在我尝试以下内容。
1st。我的抽象类...
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>();
}
}
3rd。我的表单实例化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);
}
这很好用(虽然我觉得我以错误的方式使用抽象类,但不确定)。
我的问题是:
我想创建一个新的报告类。我希望Class调用相同的方法但是让我来更改前2个参数名称,并且完全跳过最后一个。
现在这需要覆盖到方法吗?如果是这样,怎么会这样做? Label方法是否需要从虚函数?
进行更改非常感谢你!
UPDATE :: 当我提到参数时,好吧可能会有些混乱。
我的意思是说我希望从我的抽象类中调用1方法,然后在继承此标签类和方法的报告类中,我希望更改“报告参数”,我的意思是方法的主体。
原因是因为如果我只是制作另一种方法并为每个不同的报告调用它,我将使用几乎完全相同的方法。
Heres example ::改变这个..
parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramPart", part));
太过这个..
parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramchanged!!", part));
这是一个例子。所以从我收集的内容中,我在报表类中覆盖了我的标签类方法。但后来我陷入困境,如果我试图改变身体,我必须输出其余的代码。对我来说,我仍然会看到一堆看起来相同的方法。
无论如何都要改变“方法体的部分部分”,而不必输掉其余部分。
希望这会让人感到困惑。
答案 0 :(得分:2)
我不确定你所做的是最好的方法。我会重构代码,以便NewReportSetup
获取一个对象。然后,您可以让对象具有您可以访问的属性,如果未设置它们,则不要使用它们。然后,您可以创建builder类。
NewReportSetup(ReportProperties propertiesObject)
{
...
}
public class ReportProperties
{
public String Part{get;set;}
...
}
然后,您可以创建使用/格式化实现指定的给定ReportProperties
对象的子类
否则,更直接的答案是弥迦,它也有效。差异是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's Substitution Principle。在我看来,你应该使用具有适当元数据的ReportProperties
对象,无论是通过字典还是其他机制。但是,如果你不想采取任何其他方式,我会说通过抽象方法强制最终的参数是你最好的选择。
答案 1 :(得分:1)
覆盖更改功能,其中重载会更改签名。你可以这样做
class ReportShaft : Label
{
public virtual IList<Microsoft.Reporting.WinForms.ReportParameter> NewReportSetup()
{
base.NewReportSetup("part", "batch", "locn", "wheel","gear", "length", "fits", "newbar", "newbarnum", null)
}
}
如果您使用大量相同的参数或者使用您调用的默认参数,这将非常有用。另请注意,我调用base将调用基类方法而不是我正在使用的类
中的方法