首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#抽象类覆盖方法

C#抽象类覆盖方法
EN

Stack Overflow用户
提问于 2012-11-20 16:03:26
回答 2查看 8.1K关注 0票数 0

使用C#.NET4.5和Visual 2012终极版.

我现在正在用我的标签打印程序尝试缺席类,我以前使用过接口。

我用接口来连接我的两个类,效果很好。

现在我试着做以下几件事。

1.我的抽象课.

代码语言:javascript
运行
复制
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. My ReportShaft继承了.

代码语言:javascript
运行
复制
class ReportShaft : Label
{
    public virtual IList<Microsoft.Reporting.WinForms.ReportParameter> NewReportSetup()
    {         
        return new List<Microsoft.Reporting.WinForms.ReportParameter>();
    }
}

3. My实例化ReportShaft类并调用NewReportSetup().

代码语言:javascript
运行
复制
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位参数名称,完全跳过最后一条

现在,这是否需要一个覆盖的来处理该方法?如果是这样的话,怎么做呢?标签方法需要从虚拟函数中更改吗?

非常感谢各位!

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

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

之所以出现这种情况,是因为如果我简单地创建另一个方法,并对每个不同的报告调用它,我将使用几乎相同的方法。

这里的例子::改变这个..。

代码语言:javascript
运行
复制
parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramPart", part));

这也是..。

代码语言:javascript
运行
复制
parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramchanged!!", part));

这是一个例子。因此,据我所知,我在我的报表类中重写了label类方法。但是我坚持住了,如果我试图改变身体,我必须键入与它相对应的其他代码。对我来说,我还是会有一堆看起来一模一样的方法。

是否需要更改“方法主体的部分”而不必键入其他部分。

希望这能消除混乱。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-20 16:16:26

我不确定你所做的是不是最好的办法。我会重构代码,以便NewReportSetup接受一个对象。然后,您可以让对象具有您访问的属性,如果没有设置这些属性,则不使用它们。然后您可以创建一个构建器类。

代码语言:javascript
运行
复制
 NewReportSetup(ReportProperties propertiesObject)
 {
      ...
 }

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

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

否则,一个更直接的答案是弥迦的,这也是有效的。组合重于继承的区别之一。继承有其地位,但当组合是更好的方法时,不应过度使用。

用于更新

下面是您可以为更新做的事情(但是,ReportProperties对象仍然可以work...you包含所有元数据)

你的抽象课:

代码语言:javascript
运行
复制
public virtual void NewReportSetup(params)
{
    ...
    parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramBatch", batch));
    ...
    FinalizeParameters(parameters, paramsThatAreImplSpecific);
}

protected abstract void FinalizeParameters(List, paramsThatAreImplSpecific);

你的具体实施:

代码语言:javascript
运行
复制
protected override void FinalizeParameters(List, paramsThatAreImplSpecific)
{
    parameters.Add( new Microsoft.Reporting.WinForms.ReportParameter("paramPart or paramChanged", part));
}

现在,您可以使FinalizeParameters具有一个覆盖的根实现,但是您需要小心地破坏Liskov代换原理。在我看来,您确实应该使用带有适当元数据的ReportProperties对象,无论是通过字典还是其他机制。但是,我想说,如果你不想走别的路,通过抽象的方法强迫最后的param是你最好的选择。

票数 2
EN

Stack Overflow用户

发布于 2012-11-20 16:16:09

您希望过载基类中的方法,而不是覆盖

重写重载更改签名的功能。你可以这样做

代码语言:javascript
运行
复制
class ReportShaft : Label
{
  public virtual IList<Microsoft.Reporting.WinForms.ReportParameter> NewReportSetup()
    {
   base.NewReportSetup("part", "batch", "locn", "wheel","gear", "length", "fits", "newbar",  "newbarnum", null)

}
}

如果您使用相同部分的大量内容,或者有一个默认的param,则这是非常有用的。还请注意,我调用的是base,它将调用基类方法,而不是我所工作的类中的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13477170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档