2013-08-22 2 views
4

Существует два файла A.cs и B.cs. Существует метод fn(), который используется в обоих классах.Лучший способ разделить функцию между двумя файлами классов

Метод fn() используется в обоих файлах классов. Это увеличивает сложность кода, если мне нужен этот метод во многих файлах классов (скажем, 100 файлов).

Я знаю, что мы можем вызвать этот метод, создав объект для класса, в котором этот метод определен. Как я могу поделиться этой функцией между двумя или более классами, не создавая объект каждый раз для доступа к этому методу?

+0

Почему это увеличивает сложность, если 100 классов называют ваш метод? Например, если я использую метод 'String.Contains' в 100 классах, этот метод остается простым и читаемым. –

+2

сделать его статическим методом? – Yellowfog

+0

1. Создайте статический класс с помощью этого метода как статический метод. 2. Сделайте базовый класс, наследуйте весь класс из этого базового класса. Исследуйте этот метод в базовом классе – Anand

ответ

7

Поместите метод в статическом классе:

public static class Utils 
{ 
    public static string fn() 
    { 
     //code... 
    } 
} 

Вы можете назвать это A.cs и B.cs без создания нового экземпляра класса каждый раз:

A foo = new A(); 
foo.Property = Utils.fn(); 

В качестве альтернативы, вы могли бы создать BaseClass что все классы наследуют от:

public class BaseClass 
{ 
    public BaseClass() { } 
    public virtual string fn() 
    { 
     return "hello world"; 
    } 
} 

public class A : BaseClass 
{ 
    public A() { } 
} 

Вы бы затем вызвать fn() так:

A foo = new A(); 
string x = foo.fn(); 
1

Если предположить, что этот метод содержится самостоятельно, вы можете создать static class и поставить этот метод как статический метод в нем, что в свою очередь, называемый другой классы.

Если это не самодостаточно, вы можете попробовать и объявить его в каком-то суперклассе и позволить другим 100 классам расширять этот класс.

1

Надеюсь, что функция на самом деле не называется fn(), но фактически названа так, как она делает, например CalculateTotal(). Затем вы можете извлечь этот метод в класс, скажем: TotalCalculator.

Теперь при запуске приложения, предпочтительно используя инъекцию зависимости, вы создаете один экземпляр класса, который делится между объектами, которые его требуют. Как так:

class TotalCalculator 
{ 
    public int Calculate() 
    { 
     return 42; 
    } 
} 

class NeedsCalculator1 
{ 
    TotalCalculator _calculator; 

    public NeedsCalculator1(TotalCalculator calculator) 
    { 
     _calculator = calculator; 
    } 

    public void Foo() 
    { 
     _calculator.Calculate(); 
    } 
} 

class NeedsCalculatorToo 
{ 
    TotalCalculator _calculator; 

    public NeedsCalculatorToo(TotalCalculator calculator) 
    { 
     _calculator = calculator; 
    } 

    public void Bar() 
    { 
     _calculator.Calculate(); 
    } 
} 

Затем инстанцировании калькулятор один раз, и передать его в конструктор других классов:

TotalCalculator calculator = new TotalCalculator(); 

NeedsCalculator1 dependency1 = new NeedsCalculator1(calculator); 
NeedsCalculatorToo dependency2 = new NeedsCalculatorToo(calculator); 

Теперь вы можете дополнительно абстрагировать зависимость калькулятор, создав базовый класс, содержащий конструктор и защищенное поле экземпляра TotalCalculator, например.

+1

Действительно ли нужна инъекция зависимости? – dtsg

+0

Действительно ли 'static' действительно необходим? Мы не знаем, что делает 'fn()' или он или звонит ему когда-либо нужно издеваться. – CodeCaster

+0

Ну, это просто похоже на чрезмерную ИМО для того, что вполне может быть простой проблемой. Всегда лучше начинать с малого. Просто мои 2 цента. – dtsg