C# виртуальный статический метод

Вопреки принятому ответу AFAIK, (c) не является официально распознанной альтернативой символу авторского права, хотя я не уверен, что это было протестировано в суде.

Однако В© является просто abreviation слова Авторское право. Высказывание "Copyright 2008 Robert Munro" идентично высказыванию "В© 2008 Robert Munro"

Ваше "Авторское право: В© 2008 и т.д.". Расширяется для "Обеспечения авторского права: Copyright 2008 и т.д."

страница Википедии, кажется, соглашается со мной http://en.wikipedia.org/wiki/Copyright_symbol

В Соединенных Штатах, уведомление об авторском праве состоит из трех элементов: 1. В© символ, или слово "Copyright" или сокращение "Авторское право".;...

31
задан John Saunders 15 December 2014 в 16:38
поделиться

5 ответов

виртуальный означает, что вызываемый метод будет выбран во время выполнения, в зависимости от динамического типа объекта. static означает, что для вызова метода не требуется никаких объектов.

Как вы предлагаете сделать и то, и другое одним и тем же методом?

51
ответ дан 27 November 2019 в 21:34
поделиться

Эрик Липперт написал об этом в блоге, и, как обычно, в своих сообщениях он подробно освещает эту тему:

http://blogs.msdn.com/b/ericlippert /archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one.aspx

«виртуальный» и «статический» - противоположности! «Виртуальный» означает «определить вызываемый метод на основе информации о типе времени выполнения», а «статический» означает «определить вызываемый метод исключительно на основе статического анализа времени компиляции»

21
ответ дан 27 November 2019 в 21:34
поделиться

Я буду тем, кто откажется. То, что вы описываете, технически не является частью языка. Сожалею. Но можно смоделировать это в рамках языка.

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

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

Давайте соберем пример:

public interface ICurrencyWriter {
    string Write(int i);
    string Write(float f);
}

public class DelegatedCurrencyWriter : ICurrencyWriter {
    public DelegatedCurrencyWriter()
    {
        IntWriter = i => i.ToString();
        FloatWriter = f => f.ToString();
    }
    public string Write(int i) { return IntWriter(i); }
    public string Write(float f) { return FloatWriter(f); }
    public Func<int, string> IntWriter { get; set; }
    public Func<float, string> FloatWriter { get; set; }
}

public class SingletonCurrencyWriter {
    public static DelegatedCurrencyWriter Writer {
        get {
            if (_writer == null)
               _writer = new DelegatedCurrencyWriter();
            return _writer;
        }
    }
}

в использовании:

Console.WriteLine(SingletonCurrencyWriter.Writer.Write(400.0f); // 400.0

SingletonCurrencyWriter.Writer.FloatWriter = f => String.Format("{0} bucks and {1} little pennies.", (int)f, (int)(f * 100));

Console.WriteLine(SingletonCurrencyWriter.Writer.Write(400.0f); // 400 bucks and 0 little pennies

Учитывая все это , теперь у нас есть одноэлементный класс, который записывает значения валюты, и я могу изменить его поведение. Я' ve в основном определил поведение соглашение во время компиляции и теперь может изменить поведение либо во время компиляции (в конструкторе), либо во время выполнения, то есть, я считаю, эффект, который вы пытаетесь получить. Если вы хотите наследования поведения, вы можете сделать это, реализовав обратную цепочку (то есть, чтобы новый метод вызывал предыдущий).

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

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

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

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

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

Глобальная зависимость от такой структуры означает глобальную нестабильность. Это один из многих способов реализации изменяемого поведения в смутные темные дни C: структуры указателей на функции, и в данном случае единственная глобальная структура.

Глобальная зависимость от такой структуры означает глобальную нестабильность. Это один из многих способов реализации изменяемого поведения в смутные темные дни C: структуры указателей на функции, и в данном случае единственная глобальная структура.

5
ответ дан 27 November 2019 в 21:34
поделиться

Хотя технически невозможно определить статический виртуальный ], по всем причинам, уже указанным здесь, вы можете функционально выполнить то, что я думаю, пытаясь использовать методы расширения C #.

Из MSDN:

Методы расширения позволяют вам «добавлять» методы к существующим типам без создание нового производного типа, перекомпиляция или иное изменение исходный тип.

Подробнее см. Методы расширения C # (Руководство по программированию на C #) .

2
ответ дан 27 November 2019 в 21:34
поделиться

В .NET диспетчеризация виртуальных методов выполняется (примерно) путем просмотра фактического типа объекта при вызове метода во время выполнения и поиска наиболее важного метода из vtable класса. При вызове статического класса нет экземпляра объекта для проверки, поэтому нет vtable для поиска.

1
ответ дан 27 November 2019 в 21:34
поделиться
Другие вопросы по тегам:

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