【问题标题】:How to create common methods between 2 interfaces如何在2个接口之间创建通用方法
【发布时间】:2015-10-09 13:35:18
【问题描述】:
class Program
{
    interface I1
    {
        void F1();
    }

    interface I2
    {
        void F2();
    } //2 interfaces

    abstract class b1 : I1
    {
        abstract public void F1();
    }

    private class d1 : b1
    {
        public override void F1()
        {
            Console.Write("Inside D1:b1.F1");

            //I want to call my method() here
            MyMethod();
        }
    }

    private class d2 : b1
    {
        public override void F1()
        {
            Console.Write("Inside d2:b1.F1");

            //I want to call my method() here
            MyMethod();
        }
    }

   private class ImeplementI2_1 : I2
    {
        public void F2()
        {
            //Implementation
            Console.Write("Inside b_1:b_1.F2");

            //I want to call my method() here
            MyMethod();
        }
    }

   private class ImeplementI2_2 : I2
   {
       public void F2()
       {
           //Implementation
           Console.Write("Inside b_1:b_1.F2");

           //I want to call my method() here
           MyMethod();
       }
   }

    void MyMethod()
    {
        Console.WriteLine("Printmenow");
    }

    static void Main(string[] args)
    {
        I1 interface1;

        if (args.Length > 0)
        {
            interface1 = new d1();

        }
        else
        {
            interface1 = new d2();
        }

        interface1.F1();
        //I want to call my method() here
        MyMethod();

    }

}

哪里最好实现 MyMethod() ?我有 2 个接口具有不同的实现方法。所以我想了想,似乎我只能在那个类程序中使用静态方法来让每个人都开心。有什么建议或更好的解决方案吗?

【问题讨论】:

  • "我有 2 个接口的 smae 方法实现不同" 为什么?
  • 听起来你需要一个抽象类。
  • 你究竟为什么需要这个?请提供有关您的问题的更多详细信息,因为目前很难说什么
  • 看来你只需要使用explicit implementation

标签: c# interface abstraction


【解决方案1】:

使用基本类型:

interface IA {}
interface IB {}

class Base
{
    protected void MyMethod() {}
}

class A : Base, IA {}
class B : Base, IB {}

或静态方法(可能是静态类):

static class MyHelper()
{
    public static void MyMethod() {}
}

或者制作某种服务,并将该服务用作依赖项(您可以考虑在这里使用依赖注入):

interface IMyService
{
    void MyMethod();
}

class MyService : IMyService
{
    public void MyMethod() {}
}

class A : Base, IA 
{
    private readonly IMyService service;

    public A(IMyService service)
    {
        this.service = service;
    }

    // IA implementation
}

class B : Base, IB 
{
    private readonly IMyService service;

    public B(IMyService service)
    {
        this.service = service;
    }

    // IB implementation
}

【讨论】:

    【解决方案2】:

    我是否理解正确,在方法 d1.F1 中您想要调用名为 MyMethod() 的方法,而在 d2.F1 中您还想要调用名为 MyMethod() 的相同方法。

    您没有指定 MyMethod() 属于哪个类,但显然它是 d1 和 d2 都可以调用的。此外,他们调用相同的 MyMethod。我想你应该把 MyMethod 放在 d1 和 d2 的公共超类中,在你的情况下是 b1。

    你能说:“每个b1都有相同的MyMethod()吗?那么它肯定属于b1

    考虑 Shape 类和子类(如矩形、椭圆形)以及子类(如正方形和圆形)。

    如果你说每个Shape都有一个Point,我们称之为Shape的位置,那么GetPosition肯定是Shape的一个函数。

    然而,虽然每个形状都有一个面积,但计算矩形面积的方式与计算圆形面积的方式大不相同。 GetArea() 是一个典型的函数示例,它可以放置在界面中,或者作为 Shape 的抽象函数。

    【讨论】:

    • 谢谢,MyMethod() 是全新的,我必须编写它来调用其他库调用。事实上,我必须实现 3 个 MyMethods。所以我也可以创建一个新类或在其中定义。但想了解这里的最佳/最佳解决方案是什么
    【解决方案3】:

    添加另一个接口作为这两个接口的基本接口

    interface IMyMethodable
    {
        void MyMethod(); 
    }
    
    interface I1 : IMyMethodable
    {
        void F1();
    }
    
    interface I2 : IMyMethodable
    {
        void F2();
    } //2 interfaces
    

    如果你想访问 Program 类的 MyMethod,你可以做两件事:

    1) 只需将其声明为静态

    2) 将其作为委托传递并在您的类中调用

    【讨论】:

    • 你会在哪里实现它?我不想实现两次,因为这个 MyMethod() 的功能同样会消耗一些外部库调用。 ?
    • 他不需要两个接口来公开 MyMethod,他需要任一接口的所有实现都可以访问该方法。
    【解决方案4】:

    你说的很对,如果你已经编写了一个特定的方法,你希望可以从任何给定的类访问,并且不需要任何对象实例来存储任何状态,那么你需要一个 public static方法。在您的示例中,将它放在Program 中会工作,尽管在​​任何非玩具示例中,我强烈建议您不要将所有这些都嵌套在Program 类中。所有这些类型都应该是顶级类型,MyMethod 应该是某个新类型的静态方法,代表其负责执行此类操作。

    【讨论】:

      猜你喜欢
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 2021-01-12
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多