Лучшая практика для переопределения статических классов - PullRequest
1 голос
/ 25 мая 2010

Поскольку невозможно переопределить статический класс в c #, если я хочу переопределить метод, я обычно определяю делегата, совпадающего с сигнатурой статического метода, затем модифицируйте метод в соответствии с:

public static void foo(int bar)
{
  if (delegatename!=null)
  {
   delegatename.Invoke(bar);
  }
  else
  {
   //execute previous code as normal
  }
}

Я чувствую укол вины, зная, что это немного грязно.

Может кто-нибудь предложить более точное решение этой проблемы (кроме переписывания исходной структуры)

Ответы [ 2 ]

4 голосов
/ 25 мая 2010

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

public abstract class Base { ... }

public class Impl : Base { ... }

public class Singleton : Impl
{ 
    #region Static Members

    static readonly Singleton _instance = new Singleton(); 

    static Singleton() { } 

    static public Singleton Instance 
    { 
        get  { return _instance; } 
    } 

    #endregion Static Members

    #region Instance Members

    private Singleton() { } 

    // Method overrides goes here...

    #endregion Instance Members
} 

Более подробное обсуждение того, как реализовать шаблон проектирования Singleton на C #, можно найти в статье Реализация шаблона Singleton в C # .

1 голос
/ 13 июля 2012

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

Синглтоны - это круто, просто не делайте этого, используя статику. Существует множество ресурсов по «внедрению зависимостей», которые Google может легко найти для вас.

...