static class MyString : String
{
static public string[] Split(this string s)
{
return Split(s, @"\t");
}
static public string[] Split(this string s, string d)
{
return Regex.Split(s, d);
}
}
У переменной типа string есть методы. Как я понял эти методы принадлежат классу String. В идеале мне нужно переопределить метод Split не в моем классе, а в классе String, но у меня это не получилось (мало опыта).
Два вопроса:
Возможно ли переопределение в классе String, чтобы...
string a; a.Split();
...у переменной a метод Split вызывался мой?
CS0713 Статический класс "MyString" не может быть производным от типа "string". Статические классы должны быть производными от object.
1.Возможно ли переопределение в классе String, чтобы...
Нет. Метод-расширение не может переопределить метод, объявленный в классе.
Если в классе уже есть метод с такой же сигнатурой, то он всегда будет иметь приоритет над методом-расширением.
В Вашем случае сигнатура первого метода совпадает с уже существующим методом String.Split(params char[])
. Соответственно, при вызове:
var result = a.Split();
вызовется стандартный метод с пустым массивом разделителей. Согласно документации строка в данном случае делится по любым пробельным символам, а не только по табуляции:
... If the separator argument is null or contains no characters, the method treats white-space characters as the delimiters. White-space characters are defined by the Unicode standard; they return true if they are passed to the Char.IsWhiteSpace method.
Вы все еще сможете вызвать свой метод, обратившись к нему напрямую:
MyString.Split(a);
Но, чтобы использовать его как расширение Вам придется дать ему другое имя. Советую дать осмысленное название, связанное с тем, что делает метод, например SplitByTab
.
Второй метод по сигнатуре не совпадает с существующими, но для удобочитаемости кода лучше дать ему более говорящее название, отличное от стандартного Split
.
Как возможно реализовать мой вариант с моим методом? Выдает ошибку:
Для того-чтобы объявить методы-расширения не нужно наследоваться от класса. Уберите наследование от String
:
static class MyStringExtensions
{
static public string[] SplitByTab(this string s)
{
return SplitByRegex(s, @"\t");
}
static public string[] SplitByRegex(this string s, string pattern)
{
return Regex.Split(s, pattern);
}
}
System.String
, так как он является sealed
Вы можете добавить свои методы для string
с помощью extension-a:
public static class MyStringExtensions
{
public static string[] MySplit(this string s)
{
return s.Split('\t');
}
public static string[] MySplit(this string s, string d)
{
return Regex.Split(s, d);
}
}
Вы не можете переопределить уже имеющиеся методы в string
. Даже с помощью extension-а, так как в этом случае вызываться будет метод из самого класса, а не из extension-a
Используйте методы расширения и определяйте свой собственный метод. Вот пример с консольным приложением:
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string ST = "teststring";
ST.MySplit();
}
}
static class ext
{
public static string MySplit(this string str)
{
return str + "!!!";
}
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Можно ли как-то в сервис-контакте WCF, в интерфейсе, описать не методы, а аггрегированные объекты, в которых уже находятся нужные мне методы?...