簡體   English   中英

C#如何使實例化更抽象?

[英]c# how to make instantiation more abstract?

我目前正在為Excel編寫VSTO,但這也適用於其他應用程序。 該應用程序可用於許多站點,因此我正在編寫核心邏輯和特定於站點的邏輯。 我試圖將所有特定於站點的邏輯保留在單個子文件夾中,以使站點之間的交換更加容易。

VSTO有一個名為ThisAddIn.cs的類。 它實例化一個名為AddInUtilities的類。 我的看起來像這樣:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class AddInUtilities : IAddInUtilities
{
    public void ImportData()
    {
        var activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet as Excel.Worksheet;
        if (activeWorksheet == null) return;

        var loadCsv = new CsvImporter();  
        if (loadCsv.IsNotCancelled) loadCsv.AndImportIndexDataInto(activeWorksheet);
    }
}

我的CsvImporter類是特定於站點的。 它基於抽象類,而抽象類又基於接口,這使我可以將導入器中作為核心邏輯的所有內容從特定於站點的子文件夾中移開。

我無法理解的是如何使我的課程實例化

var loadCsv = new CsvImporter();

抽象? 我顯然無法實例化接口或抽象類。 我可以將此類移至特定於站點的代碼中,但是引用該類的ThisAddIn.cs將需要引用特定於站點的代碼(或至少使用該子文件夾的名稱空間)。

我能想到的解決此問題的唯一方法是將文件物理地移到子文件夾中,但保留名稱空間不變。 有沒有更好的辦法? 我覺得我缺少什么。

我建議將loadCsv設為一個類屬性,並從特定於站點的代碼中推送所需的對象:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class AddInUtilities : IAddInUtilities
{
    ICsvImporter CsvImporter = null;

    public void ImportData()
    {
        var activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet as Excel.Worksheet;
        if (activeWorksheet == null) return;

        if (CsvImporter != null && CsvImporter.IsNotCancelled) 
        {
             CsvImporter.AndImportIndexDataInto(activeWorksheet);
        }
    }
}

public class SiteSpecificClass
{
    public void SiteImportMethod()
    {
        var addinUtility = new AddInUtilities();
        addinUtility.CsvImporter = new CsvImporter();
        addinUtility.ImportData();
    }
}

暫無
暫無

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

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