Привлекательным аспектом разработки в .NET Core является понятие
SportsCar (который был написан на С#). Для начала добавьте в текущее приложение Visual Basic новый файл класса по имени PerformanceCar.vb. Модифицируйте начальное определение класса, унаследовав его от типа SportsCar с применением ключевого слова Inherits. Затем переопределите абстрактный метод TurboBoost(), используя ключевое слово Overrides:Imports CarLibrary
' Этот класс VB унаследован от класса SportsCar, написанного на C#.
Public Class PerformanceCar
Inherits SportsCar
Public Overrides Sub TurboBoost()
Console.WriteLine("Zero to 60 in a cool 4.8 seconds...")
End Sub
End Class
Чтобы протестировать новый тип класса, модифицируйте код метода Main()
Sub Main()
...
Dim dreamCar As New PerformanceCar()
' Использовать унаследованное свойство.
dreamCar.PetName = "Hank"
dreamCar.TurboBoost()
Console.ReadLine()
End Sub
Обратите внимание, что объект dreamCar
PetName), расположенному выше в цепочке наследования, невзирая на тот факт, что базовый класс был определен на совершенно другом языке и находится полностью в другой сборке! Возможность расширения классов за пределы границ сборок в независимой от языка манере — естественный аспект цикла разработки в .NET Core. Он упрощает применение скомпилированного кода, написанного программистами, которые предпочли не создавать свой разделяемый код на языке С#.Открытие доступа к внутренним типам для других сборок
Как упоминалось ранее, внутренние (internal
Начните с добавления в проект CarLibrary
MyInternalClass со следующим кодом:namespace CarLibrary
{
internal class MyInternalClass
{
}
}
На заметку!
Зачем вообще открывать доступ к внутренним типам? Обычно это делается для модульного и интеграционного тестирования. Разработчики хотят иметь возможность тестировать свой код, но не обязательно открывать к нему доступ за границами сборки.Использование атрибута assembly
Атрибуты будут более детально раскрыты в главе 17, но пока откройте файл класса Car.cs
CarLibrary и добавьте показанный ниже атрибут и оператор using:using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("CSharpCarClient")]
namespace CarLibrary
{
}
Атрибут InternalsVisibleTo
На заметку!
В предшествующих версиях .NET использовался файл классаAssemblyInfо.cs, который по-прежнему существует в .NET Core, но генерируется автоматически и не предназначен для потребления разработчиками.Теперь можете модифицировать проект CSharpCarClient
Main() следующий код:var internalClassInstance = new MyInternalClass();
Код работает нормально. Затем попробуйте сделать то же самое в методе Main()
VisualBasicCarClient:' Не скомпилируется
' Dim internalClassInstance = New MyInternalClass()
Поскольку библиотека VisualBasicCarClient
Использование файла проекта
Еще один способ добиться того же (и можно утверждать, что он в большей степени соответствует стилю .NET Core) предусматривает применение обновленных возможностей файла проекта .NET Core.
Закомментируйте только что добавленный атрибут и откройте файл проекта CarLibrary
ItemGroup, как показано ниже:
Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">