Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#如何使实例化更抽象?_C#_Class_Abstraction - Fatal编程技术网

c#如何使实例化更抽象?

c#如何使实例化更抽象?,c#,class,abstraction,C#,Class,Abstraction,我目前正在为Excel编写VSTO,但这也适用于其他应用程序。该应用程序适用于多个站点,因此我正在编写核心逻辑和站点特定逻辑。我试图将所有特定于站点的逻辑保存在一个子文件夹中,以便更容易在站点之间进行交换 VSTO有一个名为ThisAddIn.cs的类。它实例化了一个名为AddInUtilities的类。我的看起来像这样: [ComVisible(true)] [ClassInterface(ClassInterfaceType.None)] public class AddInUtilitie

我目前正在为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();
抽象的?我显然无法实例化接口或抽象类。我可以将此类移动到特定于站点的代码中,但是引用此类的my
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();
    }
}

你考虑过使用@Aron吗,就像说“你考虑过使用面向对象编程吗”@Aron你是什么意思?我的大部分逻辑都是建立在坚实的基础上的。。好吧,我尽可能坚持。怎么样:
AbstractClass loadCsv=new CsvImporter()
然后你可以作为
AbstractClass
传递
loadCsv
。您也可以使用接口标识来实现这一点。允许您动态创建类型。我不知道它是否在VSTOSorry中可用,我忘了用我给实例变量的名称替换它。相应地编辑了我的答案。谢谢,这看起来像我想要的,但有一个钩子不见了。调用
SiteImportMethod
的是什么?
AddInUtilities.ImportData()
方法是从代码中的某个点调用的。我从一个特定于站点的类中进行假设。这就是我试图在我的模型课上展示的。因此,不要调用
SiteImportMethod
,而是在通常只调用ÀddInUtilities.ImportData`谢谢@Romano Zumbé的地方使用此代码-问题是,
AddInUtilities.ImportData()
是从VSTO类的
ThisAddIn.cs
类调用的,因此,它会将特定类推到链的更高位置。我暂时离开了它,因为我需要完成这个项目,但总有一天我会再次讨论这个问题。