2015-12-16 1 views
2

Я упростил, что у меня есть в этом:Дайте метод между 2 классов C#

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"); 
} 

Как вы можете видеть, класс A и B имеют одинаковый SendCommand() метод, но так как их ivi s инициализируются с другим адресом , команды отправляются на разные инструменты.

Похоже, что один и тот же метод скопирован в два разных класса. Но я действительно хочу, чтобы мой Main() выглядел так, как сейчас, так что будет ясно, ссылается ли SendCommand() на инструмент A или на прибор B.

Как слить их?

+2

Вам действительно нужны два класса? Разве у вас не было одного класса с двумя заводскими методами для создания экземпляров с разными исходными данными? Если нет, вам может понадобиться абстрактный базовый класс, из которого оба получаются. –

+0

@ Jon Skeet Объединить два класса и создать два разных '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Но тогда мне все равно нужно иметь 2 набора методов SendCommand() - один содержит 'ivi1.Send()', другой содержит 'ivi2.Send()' –

+1

Нет, у вас будет один класс, но вы бы создали разные * экземпляры * класса. В основном такой же ответ, как не повезло. –

ответ

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"); 
} 
1

Ввести базовый класс?

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); 
    } 
} 
+0

Как это сделать, если в настоящее время классы A и B уже наследуются от класса C (И я ничего не могу сделать о классе C). –

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.

1

Вам нужен базовый интерфейс, давайте назовем его 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"); 
} 
+0

Извините, я пропустил что-то в своей треске e, классы A и B уже наследуются от некоторого класса, к которому я не могу получить доступ (это ссылка на сборку). –

+0

Не имеет значения. Вы можете реализовать столько интерфейсов, сколько хотите с классом. –

+0

Итак, у меня есть «Класс A: SomeOtherClass», как я могу реализовать «ICommandSender»? Я наследую 'SomeOtherClass' в интерфейсе? –

Смежные вопросы