在 C# 中,如何在两个类之间共享一个方法?

3

我将我的内容简化为以下:

class A : SomeClassICantAccess
{
    IVIClass ivi = new IVIClass();

    public A()
    {
        string address = "1111";
        ivi.Initialize(address);
    }

    public void SendCommand(string cmd)
    {
        ivi.Send(cmd);
    }
}

class B : SomeClassICantAccess
{
    IVIClass ivi = new IVIClass();

    public B()
    {
        string address = "2222";
        ivi.Initialize(address);
    }

    public void SendCommand(string cmd)
    {
        ivi.Send(cmd);
    }
}

class Main()
{
    //I want my main to keep this format
    A a = new A();
    B b = new B();

    a.SendCommand("commands");
    b.SendCommand("commands");
}

正如您所看到的,类 AB 有相同的 SendCommand() 方法,但由于它们的 ivi 使用不同的地址进行初始化,因此命令被发送到不同的仪器。
在两个不同的类中复制粘贴相同的方法似乎是错误的,但我确实希望我的 Main() 看起来像现在这样 - 这样可以清楚地表明是否将 SendCommand() 引用到仪器 A 或仪器 B。
我该如何合并它们?

2
你真的需要两个类吗?你不能只用一个类,然后通过两个工厂方法创建具有不同初始数据的实例吗?如果不行,你可能需要一个抽象基类,让这两个类都继承它。 - Jon Skeet
@Jon Skeet 合并这两个类,然后在类内实例化两个不同的 ivi?但是这样我仍然需要有两组 SendCommand() 方法 - 其中一个包含 ivi1.Send(),另一个包含 ivi2.Send() - Liren Yeo
1
不,你只需要一个类,但是你会创建该类的不同实例。基本上这与un-lucky给出的答案相同。 - Jon Skeet
//我想让我的主函数保持这个格式<-您指的是什么格式?这两个类吗?如果您出于某种原因想要保留这两个类(也许这只是一个不完整的实现,并且它们的区别比这里更大),我建议参考Backs的答案https://dev59.com/VJLea4cB1Zd3GeqPyBw-#34305991。 - Jannik
我在我的代码中忘记了继承,对此感到抱歉。类A和B实际上是从一个我无法访问的类(DLL引用)继承而来的。在这种情况下,我该如何创建一个基类并使A和B从它继承? - Liren Yeo
这是一个非常基础的OOD问题。它可以通过简单的OO编程技术(如继承或更好的聚合)来解决,或者根据整个场景的复杂性选择其中的一种模式。最终,这相当于基于观点,并且很大程度上取决于整个上下文。 - Stefan Steinegger
4个回答

3
如果这是您的实际情况,就不需要两个类,您只需要处理 A 类即可:
A 类的定义如下:
class A()
{
    IVIClass ivi = new IVIClass();
    public A(string address)
    {        
        ivi.Initialize(address);
    }
    public void SendCommand(string cmd)
    {
        ivi.Send(cmd);
    }
}

如何使用:

class Main()
{   
    A a = new A("1111");//initialize  ivi with "1111"
    A b = new A("2222");//initialize  ivi with "2222"
    a.SendCommand("commands");
    b.SendCommand("commands");
}

2
您需要一个基本接口,我们称之为 ICommandSender 和一个扩展方法,该方法以 ICommandSender 实例作为源。
// Base interface
public interface ICommandSender
{
    // Shared definition
    IVIClass ivi;
}

public class A : SomeOtherClass, ICommandSender
{
    // A code here
}

public class B : SomeOtherClass, ICommandSender
{
    // B code here
}

// Extension Methods are held in a static class (think Façade Pattern)
public static class ExtMethods
{
    // Accept the source and cmd 
    // The this keyword indicates the target type.
    public static void SendCommand(this ICommandSender source, string cmd)
    {
        source.ivi.Send(cmd);
    }
}

// Main doesn't change at all.
class Main()
{
    //I want my main to keep this format
    A a = new A();
    B b = new B();

    a.SendCommand("commands");
    b.SendCommand("commands");
}

抱歉,我的代码中漏掉了一些东西,A类和B类已经继承了我无法访问的某个类(它来自一个程序集引用)。 - Liren Yeo
一个类可以实现任意多个接口。 - The Sharp Ninja
目前我有 Class A : SomeOtherClass,如何实现 ICommandSender? 我需要在接口中继承 SomeOtherClass 吗? - Liren Yeo
你只需继承SomeOtherClass并实现ICommandSender接口。我已经更新了A和B类定义的答案代码。 - The Sharp Ninja

0

介绍一个基类?

class BaseClass
{
    IVIClass ivi = new IVIClass();
    public void SendCommand(string cmd)
    {
        ivi.Send(cmd);
    }
}

class A : BaseClass
{   
    public A()
    {
        string address = "1111";
        ivi.Initialize(address);
    }
}

class B : BaseClass
{   
    public B()
    {
        string address = "2222";
        ivi.Initialize(address);
    }
}

如果当前类A和B已经继承自类C(而且我无法对类C进行任何更改),那么我该如何做到这一点? - Liren Yeo

0
abstract class AbstractClass{

   protected String socket;

   public AbstractClass(String socket){
      this.socket = socket;
   }

   public virtual void SendCommand(String cmd){
     //dostuff
   }

}

class A : AbstractClass{
  public A(String socket):base(socket){
  }

  //you can ovverride the virtual method if need be. 
}

对于B类同样适用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接