通过接口调用方法,而不创建接口的新实例

本文关键字:接口 新实例 实例 创建 调用 方法 | 更新日期: 2023-09-27 17:59:15

我想做的其实很简单,但由于某种原因,我要么走错了路,要么只是错过了一些重要的专有技术,因为我无法在不创建类/接口的新实例的情况下通过接口调用方法。

无论哪种方式,我试图实现的是通过实现该方法的接口调用以下方法,而不必创建新实例。

public partial class MyClass : IMyInterface
{
   public void MyMethod(object obj)
   {
      //Method code....
   }
 }

我的接口

public interface IMyInterface
{
   void MyMethod(object obj);
}

我的解决方案有三个项目

  • 数据
  • 服务
  • UI

Interface和MyClass.xaml.cs在UI中,我正试图通过使用接口的现有实例从服务层中的类调用MyMethod()方法。

我在代码的另一个部分做了这样的操作,但在这里不起作用,我不知道为什么

//Register interface
internal static IMyInterface mi;
//and call it like so
mi.MyMethod(Object);

我在谷歌上做了很多搜索,但每个人似乎都创建了一个新的实例,在我的情况下,这不是一个有效的选择。

通过接口调用方法,而不创建接口的新实例

我试图实现的是通过实现该方法的接口,而不必创建新的实例

实现方法-的接口是错误的假设。接口从未实现该方法。它只是说实现这个接口的人应该实现那个方法。

实现您的接口的类——在您的例子中是MyClass。你需要创建一个实例。

internal IMyInterface mi = new MyClass();
mi.MyMethod(Object);

没有其他办法。

通过使用接口的现有实例。

因此,如果您已经创建了MyClass类的一个实例,那么您可以像这样为它实现Singleton。因此,您的单个实例将在任何地方都可用。

例如:

public partial class MyClass : IMyInterface
{
    private static IMyInterface _instance;
    public static IMyInterface Instance
    { 
        get 
        {
            if (_instance == null) _instance = new MyClass();
            return _instance;
        }
    }
    public void MyMethod(object obj)
    {
       //Method code....
    }
}

//Register interface
internal static IMyInterface mi = MyClass.Instance;
//and call it like so
mi.MyMethod(Object);

您不能创建接口的实例。您可以通过对象实现的接口访问对象。例如,如果您有一个List<T>,您可以通过IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>访问它。

接口没有任何代码或任何实现。你定义了一个像IFruit这样的接口,它有ColorTaste属性以及Eat方法,但你没有在其中实现任何东西。当你说Red Apple类正在实现IFruit时,你就实现了该类中的属性和方法。

换句话说,您可以通过接口访问对象。接口后面必须有一个对象。

去死这个。

我将提供一种替代方法/路径,为接口的实现和执行提供不同的方法

.Net Fiddle(清除短URL时包含的内容)

设置

接口

public interface IMyInterface{
    void MyMethod();
}

类别

public class MyClass : IMyInterface{
    // Implicit Implementation
    public void MyMethod(){
        Console.WriteLine("* Entered the Implicit Interface Method");
        (this as IMyInterface).MyMethod();
    }
    // Explicit Implementation
    void IMyInterface.MyMethod(){
        Console.WriteLine("--> Entered the Explicit Interface Method");
    }
}

执行

using System;
public class Program
{
    public static void Main()
    {
        var cl = new MyClass();
        Console.WriteLine("Executing method off Object");
        Console.WriteLine("--------------------------------");
        cl.MyMethod();
        Console.WriteLine("");
        Console.WriteLine("");
        Console.WriteLine("Executing method through Casting");
        Console.WriteLine("--------------------------------");
        (cl as IMyInterface).MyMethod();
    }
}

结果

Executing method off Object
--------------------------------
* Entered the Implicit Interface Method
--> Entered the Explicit Interface Method

Executing method through Casting
--------------------------------
--> Entered the Explicit Interface Method