Я хочу добавить функцию в класс System.IO.Path.vb.net Можно ли расширить системный класс?
Проблема - путь неинтегрирован.
Так делать это невозможно:
Imports System.IO
Public Class Path : Inherits System.IO.Path
End Class
Я хочу добавить функцию в класс System.IO.Path.vb.net Можно ли расширить системный класс?
Проблема - путь неинтегрирован.
Так делать это невозможно:
Imports System.IO
Public Class Path : Inherits System.IO.Path
End Class
Вы можете использовать методы расширения. Эти функции, как представляется, являются функциями расширенного класса, но между ними нет реальной связи. Тем не менее, они делают программирование более удобным.
http://msdn.microsoft.com/en-us/library/bb384936.aspx
Update: Давайте посмотрим пример. Обратите внимание, что это фрагменты из 3-х файлов.
'Noninheritable baseclass
Public NotInheritable Class BaseClass
Function f()
Return 42
End Function
End Class
'Extension
Imports System.Runtime.CompilerServices
Module ExtModule
<Extension()>
Public Sub Print(ByVal bc As BaseClass)
Console.WriteLine(bc.f())
End Sub
End Module
'Usage
Sub Main()
Dim bc As BaseClass
bc = New BaseClass()
bc.Print() 'Calling the extension method
End Sub
И он говорит 42
.
Проблема не в наследовании класса «система», но NonInheritable
один, который по своей конструкции и, как следует из названия, не наследуется.
Почему вы все равно хотите наследовать его? Вы расширяете (наследуете) класс, чтобы добавить поведение к его экземплярам. В случае с Path нет экземпляров, Path - это просто «контейнер» для группировки аналогичных методов, связанных с манипуляцией с файловой системой.
Что вы должны сделать, так это создать Module для ваших дополнительных методов или собственного класса NotInheritable.
Inherting был единственным способом, которым я пытался расширить функциональность System.IO.Path. Я хочу добавить свою функцию «bla()» в класс Path, потому что я не хочу иметь другой класс для этой функции bla(). – MaBi
@MaBi Ваш вопрос: «Можно ли расширить системный класс?», Я предположил, что «расширение» означает «наследование», «подклассификация», как это понимают большинство программистов ООП. Я обновил ответ на основе вашего комментария. –
спасибо за обновление вашего ответа! – MaBi
Вы не можете расширить классы NotInheritable, AFAIK –
Работает. Официальные ребята не упоминают такую проблему в [их блоге] (http://blogs.msdn.com/b/vbteam/archive/2007/03/10/extension-methods-best-practices-extension-methods-part -6.aspx). Есть некоторые ограничения, но я не нашел ничего сложного. –
Попробуйте расширить 'Path', и вы увидите. OP хочет расширить «путь», в частности. Проблема заключается в том, что методы расширения работают с экземплярами, и вы не можете создать экземпляр «Путь». –