Почему я не могу объявить методы C#, виртуальные и статичные?

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

Это взяло вполне немного дольше, прежде чем я действительно выяснил точку: Скажем, Вы работаете над большой системой, и Вы пишете маленький модуль. Это компилирует, Вы проверяете его в деле, это работает отлично, Вы идете дальше к следующей задаче. Девять месяцев по линии и две версии позже, которые кто-то еще вносит изменением в [приблизительно 110] по-видимому несвязанная часть программы, и это повреждает модуль. Хуже, они тестируют свои изменения и свои работы кода, но они не тестируют Ваш модуль; черт, они даже не могут знать, что Ваш модуль существует .

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

решением являются модульные тесты. Они поймают проблемы, когда Вы запишете код - который прекрасен - но Вы, возможно, сделали это вручную. Реальная выплата - то, что они поймают проблемы девять месяцев по линии, когда Вы будете теперь работать над совершенно другим проектом, но летний интерн думает, что это будет выглядеть более опрятным, если те параметры были в алфавитном порядке - и затем модульный тест, Вы записали, что путь назад перестал работать, и кто-то бросает вещи в интерн, пока он не возвращает порядок параметра. Это "почему" из модульных тестов.:-)

50
задан Luke 29 October 2008 в 10:32
поделиться

3 ответа

Я не думаю, что вы сошли с ума. Вы просто хотите использовать то, что в настоящее время невозможно в .NET.

Ваш запрос на виртуальный статический метод имел бы большой смысл, если бы мы говорили о дженериках. Например, моя будущая просьба к дизайнерам CLR - разрешить мне писать интерфейс следующим образом:

public interface ISumable<T>
{
  static T Add(T left, T right);
}

и использовать его так:

public T Aggregate<T>(T left, T right) where T : ISumable<T>
{
  return T.Add(left, right);
}

Но сейчас это невозможно, поэтому я делаю это так:

    public static class Static<T> where T : new()
    {
      public static T Value = new T();
    }

    public interface ISumable<T>
    {
      T Add(T left, T right);
    }

    public T Aggregate<T>(T left, T right) where T : ISumable<T>, new()
    {
      return Static<T>.Value.Add(left, right);
    }
32
ответ дан 7 November 2019 в 10:39
поделиться

Я пришел из Delphi, и это одна из многих функций, которых мне очень не хватает в C #. Delphi позволит вам создавать ссылки на типизированные типы, и вы можете передавать тип производного класса везде, где требуется тип родительского класса. Такое обращение с типами как с объектами имело огромную пользу. В частности, позволяет определять метаданные во время выполнения. Я ужасно смешиваю синтаксис здесь, но в C # это будет выглядеть примерно так:

    class Root {
       public static virtual string TestMethod() {return "Root"; }
    }
    TRootClass = class of TRoot; // Here is the typed type declaration

    class Derived : Root {
       public static overide string TestMethod(){ return "derived"; }
    }

   class Test {
        public static string Run(){
           TRootClass rc;
           rc = Root;
           Test(rc);
           rc = Derived();
           Test(rc);
        }
        public static Test(TRootClass AClass){
           string str = AClass.TestMethod();
           Console.WriteLine(str);
        }
    } 

выдаст: Корень производное

8
ответ дан 7 November 2019 в 10:39
поделиться

Фактически возможно объединить виртуальное и статическое для метода или члена, используя ключевое слово new вместо virtual .

Вот пример:

class Car
{
    public static int TyreCount = 4;
    public virtual int GetTyreCount() { return TyreCount; }
}
class Tricar : Car
{
    public static new int TyreCount = 3;
    public override int GetTyreCount() { return TyreCount; }
}

...

Car[] cc = new Car[] { new Tricar(), new Car() };
int t0 = cc[0].GetTyreCount(); // t0 == 3
int t1 = cc[1].GetTyreCount(); // t1 == 4

Очевидно, значение TyreCount могло быть установлено в переопределенном методе GetTyreCount , но это позволяет избежать дублирования значения. Можно получить значение как из класса, так и из экземпляра класса.

Теперь может кто-нибудь найти действительно разумное использование этой функции?

1
ответ дан 7 November 2019 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: