【问题标题】:How to reuse the same variable, but for different types?如何重用相同的变量,但用于不同的类型?
【发布时间】:2010-10-30 15:50:28
【问题描述】:

我在理解“T 型”的幕后发生了什么事情来解决这个问题时遇到了一些问题,我希望你们中的一些人可以在隧道尽头向我展示一盏灯 :)

我有一个COM object,我几乎分配了一些东西(属性),但我需要将它用于所有对象,并且我想这样做一次,并且只有它适用于所有类型。

打印机类型:

switch (type)
{
    case convert2pdf.ConvertFileType.Word: 
        WordPrintJob oPrintJob = null; break;
    case convert2pdf.ConvertFileType.Excel: 
        ExcelPrintJob oPrintJob = null; break;
    case convert2pdf.ConvertFileType.PowerPoint: 
        PowerPointPrintJob oPrintJob = null; break;
    case convert2pdf.ConvertFileType.IE: 
        IEPrintJob oPrintJob = null; break;
    case convert2pdf.ConvertFileType.Publisher: 
        PublisherPrintJob oPrintJob = null; break;
    case convert2pdf.ConvertFileType.Visio: 
        VisioPrintJob oPrintJob = null; break;

    default: 
        GenericPrintJob oPrintJob = null; break;
}

然后,无论我创建什么对象类型,我每次都实现:

PDFSetting oPDFSetting = null;

oPrintJob = oPrinter.GenericPrintJob;
oPDFSetting = oPrintJob.PDFSetting;

/*put water mark on the first page, set the water mark text to "BCL EasyPDF */
oPDFSetting.set_Watermark(0, true);
oPDFSetting.set_WatermarkColor(0, (uint)System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Blue));
oPDFSetting.set_WatermarkFirstPageOnly(0, true);
oPDFSetting.set_WatermarkText(0, "EasyPDF");

/*set the meta data for the pdf file*/
oPDFSetting.MetaData = true;
oPDFSetting.MetaDataAuthor = "Your Name";
oPDFSetting.MetaDataCreator = "BCL";
oPDFSetting.MetaDataKeywords = "PDF";
oPDFSetting.MetaDataSubject = "Converter";
oPDFSetting.MetaDataTitle = "easyPDF SDK";

我如何使用“T 型”的东西(男人......经过 3 年的 C# 我仍然无法理解,无论我阅读什么,我阅读了 Wikipedia、ASP.NET 3.5 专业书籍、教程、 ...) :(

也就是说,我怎样才能重用这些属性。

我考虑过创建一个 ExtensionMethod,但我将不得不编写所有这些方法并且不能重用任何代码... 我考虑过创建一个通用控件并创建一个继承该基础控件的新控件,以便我可以使用

GlocalObject oPrintJob = null;

...

WordPrintJob oPrintJob = (WordPrintJob)GlocalObject;

我说的有道理吗?


更新答案

好的,所以,没有“类型 T”,但基类/接口...... 然后,我尝试创建该接口,以便可以从中继承,并得到下面的图像:

alt text http://www.balexandre.com/temp/2009-06-02_1521_soQuestion_Interface.png

如果界面中我说的是 PrintJob 类型,那我该如何返回一个 WordPrintJob 类型呢? :-(我不明白...

【问题讨论】:

    标签: c# inheritance types


    【解决方案1】:

    您需要定义一个基类PrintJob 并将PDFSetting 作为其属性。

    然后将WordPrintJob、ExcelPrintJob等定义为PrintJob的子类。

    我已经很久没有这样做了,所以我不记得您是否能够从子类访问PDFSettings,或者您是否必须将变量强制转换为基类首先。

    【讨论】:

      【解决方案2】:

      Chris 基本上是正确的,所以你的 switch 语句看起来是这样的::

      PrintJob oPrintJob = null;
      switch (type)
      {
          case convert2pdf.ConvertFileType.Word: 
              oPrintJob = new WordPrintJob(); 
              break;
          case convert2pdf.ConvertFileType.Excel: 
              oPrintJob = new ExcelPrintJob(); 
              break;
          case convert2pdf.ConvertFileType.PowerPoint: 
              oPrintJob = new PowerPointPrintJob(); 
              break;
          case convert2pdf.ConvertFileType.IE: 
              oPrintJob = new IEPrintJob(); 
              break;
          case convert2pdf.ConvertFileType.Publisher: 
              oPrintJob = new PublisherPrintJob(); 
              break;
          case convert2pdf.ConvertFileType.Visio: 
              oPrintJob = new VisioPrintJob(); 
              break;
          default: 
              oPrintJob = new GenericPrintJob();
              break;
      }
      

      PDFSettings 属性将在您的 PrintJob 基类中定义,并且每个特定的打印作业类都将从该基类继承。

      【讨论】:

      • +1 代码。如果我不每天使用它,我永远不会忘记多少忘记它!
      • 尝试了接口,但我不知道如何正确,如何创建一个可以返回所有这些类型的方法?
      • 正如chills42 所说,该方法将始终返回PrintJob。听起来您可能需要简要复习一下面向对象的开发。继承和多态是这里的关键词。
      • 是的,我愿意...回到阅读...感谢您的帮助!非常感谢
      【解决方案3】:

      除了Lazurus's answer,您可能还想创建一个接口,并针对它进行大部分编码,而不是基类。

      【讨论】:

      • 尝试了接口,但我不知道如何正确,如何创建一个可以返回所有这些类型的方法?
      • 你没有。您返回基本类型。让多态来做这些脏活。
      • 正如拉撒路所说...我需要回去阅读...谢谢帮助!非常感谢
      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多