Чтобы добиться инкапсуляции, мы не должны открывать наши поля непосредственно снаружи, даже классу в нашей собственной сборке.
Вместо этого у нас может быть внутренний метод получения, так что только классы внутри нашей сборки могут получить доступ к нему, использовать его, но не может изменить его ссылку.
Если мы go сделаем еще один шаг и хотим, чтобы абстрактный / базовый класс расширялся только классами в нашей собственной сборке:
Имея базовый класс publi c и указав все конструкторы как внутренние, мы можем быть уверены, что только классы в нашей собственной сборке смогут его расширять.
public abstract class SerialDevice
{
private SerialPort _serialPort;
internal SerialPort GetSerialPort()
{
return _serialPort;
}
// We define our base class public,
// but also define all the constructors internal
// Therefore, no class outside our assembly extend it
// but we still can expose sub classes (like Widget) to the outside
internal SerialDevice()
{
}
// The serial port has some shared methods.
// These methods are still visible from the outside
public void Open()
{
_serialPort.Open();
}
}
И,
public class Widget : SerialDevice
{
// The serial port has some widget-specific functionality.
public void UniqueCommand()
{
GetSerialPort().WriteLine("Hello world.");
}
}