2012-03-01 2 views
0

Я прочитал несколько статей и т. Д., Здесь и из Google, о попытке выполнить мою задачу. Я, наверное, слишком усложняю дела.Каков наилучший способ «наследовать» набор переменных и подпрограмм, которые являются статичными, поэтому они могут быть переопределены.

Теперь, прежде чем вы все это скажете, Я знаю, что вы не можете наследовать статические элементы/подпрограммы. Я спрашиваю, как делать то, что мне нужно, и правильно.

Я пишу статический вспомогательный класс, который имеет несколько членов и подпрограмм. Он должен быть статичным в зависимости от характера задач, с которыми он работает, поэтому я не могу сделать его экземпляр, если вы не скажете мне об этом иначе.

Что мне нужно, чтобы сделать базовый статический класс, который будет работать и выполнять логику (Помощник), но тогда мне нужно будет создать новый класс (по существу статический), который я могу ставить один или несколько «новых» статических методов, которые переопределяют базовые методы, но где этот класс теперь действует как базовый, проходящий через его члены.

Я сначала подумал, используя интерфейс, но для этого нужен экземпляр.

Как вы думаете, что это лучший способ решить эту проблему?

+0

Нам понадобится пример того, что вы пытаетесь выполнить ... –

ответ

0

Смотрите этот ответ: Why can't I have abstract static methods in C#? понять, почему абстрактные статические классы не могут быть использованы в C#

вы можете также использовать одноплодную шаблон, чтобы убедиться, что только один экземпляр существует для вашего класса:

public class Singleton 
{ 
    private static Singleton instance; 

    private Singleton() {} 

    public static Singleton Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      instance = new Singleton(); 
     } 
     return instance; 
     } 
    } 
} 
+0

Прежде чем я продолжу это, у меня есть еще один запрос: вся причина, по которой я делая это, чтобы отделить зависимость от System.Web ... Я до сих пор не думал об этом, но должен ли я выполнить то, что я делаю, с двумя отдельными сборками? Базовая - это сборка без ссылки System.Web ... Если вам интересно, почему, я пишу уровень доступа к данным, который затем можно использовать с любыми веб-проектами или Windows Forms и т. Д. – Anthony

+0

Да, если базовый ссылка System.Web, то любые унаследованные классы также будут, поэтому, если вы хотите, чтобы один из них был с System.Web и один без него, тогда база должна быть такой, без ссылки System.Web. – jzworkman

2

Похоже, что один из ваших классов может быть обычным классом. Затем вы можете использовать композицию, чтобы объединить два, чтобы достичь того, что вам нужно. Я бы разорвать вещи, как это:

internal class TaskProcessor 
{ 
    // All of the work/logic goes in this class which can have instances 
} 

public static class StaticHelper 
{ 
    private TaskProcessor _processor = new TaskProcessor(); 

    public static void SomeMethod() 
    { 
     _processor.SomeMethod(); 
    } 

    // And so on 
} 
+0

Проблема заключается в том, что базовый класс должен иметь статические свойства и подпрограммы, то есть, по крайней мере, я думаю, это должно быть. Среди других вещей это вспомогательный помощник nHibernate. Мое намерение состоит в том, чтобы выделить логику, которая ссылается System.Web на «расширенный» статический класс. Я не могу сделать экземпляр, думаю, шаблон Singleton (в любом случае, основываясь на моих знаниях). – Anthony

+0

Почему бы не использовать шаблон singleton, а затем здесь, чтобы убедиться, что у вас есть только один экземпляр и он использует тот же самый экземпляр для всего. Тогда вы можете достичь желаемого наследования. – jzworkman

+0

Подождите. Я просто перечитаю ваш ответ. Doh! Я могу попробовать, но я уверен, что вы правы. Поскольку я только делаю один маршрут к статическому классу, либо расширенный, либо база напрямую, то выполнение этого будет одинаковым, не так ли? Будет ли «instanced» класс оставаться в распоряжении на время жизни приложения, т.е.веб-экземпляр при запуске приложения? – Anthony

1

Для меня это вся цель extension methods. Предоставление безопасного способа совместной работы между типами, соответствующими стандарту. У вас может быть перегрузка одного и того же метода расширения для обеспечения различной функциональности для типов рассеивания при сохранении семантически аналогичного кода.

0

If вы пытаетесь избежать в зависимости от System.Web во всем мире, вы можете использовать своего рода инъекцию зависимости.

// Base assembly; does not reference System.Web 
public class HelperBase 
{ 
    public virtual void DoSomething() { ... } 
    public virtual void DoSomethingElse() { ... } 
} 

public static class StaticHelper 
{ 
    public static HelperBase Helper { get; set; } 
    static void DoSomething() 
    { 
     Helper.DoSomething(); 
    } 

    static void DoSomethingElse() 
    { 
     Helper.DoSomethingElse(); 
    } 
} 

// HelperWeb assembly; references System.Web, base assembly 
public class HelperWeb : HelperBase 
{ 
    // override base implementation, using System.Web 
    public virtual void DoSomethingElse() { ... } 
} 


// usage at top level: 

StaticHelper.Helper = new HelperBase(); 
// or 
StaticHelper.Helper = new HelperWeb(); 

StaticHelper.DoSomething(); 

Таким образом, StaticHelper не требует ссылки на System.Web. Вам нужно всего лишь ссылаться на System.Web на верхнем уровне, если вы действительно используете Helper, который нуждается в System.Web. Вы даже можете использовать отражение, чтобы условно загрузить сборку HelperWeb только во время выполнения.