Вопреки принятому ответу AFAIK, (c) не является официально распознанной альтернативой символу авторского права, хотя я не уверен, что это было протестировано в суде.
Однако В© является просто abreviation слова Авторское право. Высказывание "Copyright 2008 Robert Munro" идентично высказыванию "В© 2008 Robert Munro"
Ваше "Авторское право: В© 2008 и т.д.". Расширяется для "Обеспечения авторского права: Copyright 2008 и т.д."
страница Википедии, кажется, соглашается со мной http://en.wikipedia.org/wiki/Copyright_symbol
В Соединенных Штатах, уведомление об авторском праве состоит из трех элементов: 1. В© символ, или слово "Copyright" или сокращение "Авторское право".;...
виртуальный
означает, что вызываемый метод будет выбран во время выполнения, в зависимости от динамического типа объекта. static
означает, что для вызова метода не требуется никаких объектов.
Как вы предлагаете сделать и то, и другое одним и тем же методом?
Эрик Липперт написал об этом в блоге, и, как обычно, в своих сообщениях он подробно освещает эту тему:
«виртуальный» и «статический» - противоположности! «Виртуальный» означает «определить вызываемый метод на основе информации о типе времени выполнения», а «статический» означает «определить вызываемый метод исключительно на основе статического анализа времени компиляции»
Я буду тем, кто откажется. То, что вы описываете, технически не является частью языка. Сожалею. Но можно смоделировать это в рамках языка.
Давайте рассмотрим, что вы просите - вам нужен набор методов, которые не привязаны к какому-либо конкретному объекту, которые можно легко вызвать и заменяемый во время выполнения или компиляции.
На мой взгляд, это похоже на то, что вам действительно нужен одноэлементный объект с делегированными методами.
Давайте соберем пример:
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: структуры указателей на функции, и в данном случае единственная глобальная структура.Хотя технически невозможно определить статический виртуальный ], по всем причинам, уже указанным здесь, вы можете функционально выполнить то, что я думаю, пытаясь использовать методы расширения C #.
Из MSDN:
Методы расширения позволяют вам «добавлять» методы к существующим типам без создание нового производного типа, перекомпиляция или иное изменение исходный тип.
Подробнее см. Методы расширения C # (Руководство по программированию на C #) .
В .NET диспетчеризация виртуальных методов выполняется (примерно) путем просмотра фактического типа объекта при вызове метода во время выполнения и поиска наиболее важного метода из vtable класса. При вызове статического класса нет экземпляра объекта для проверки, поэтому нет vtable для поиска.