Ещё одно усовершенствование.

Если в райдер добавить некий абстрактный локатор:
## Код:
```
public abstract class Rider
{
   public virtual object Locator { get { return null; } }
}

public abstract class Writer: Rider
{
   public abstract void WriteByte (byte b);
   public abstract void WriteBytes (byte[] bytes, int offset, int count);
   public virtual void WriteBoolean (bool x)
   ...
}

public abstract class Reader: Rider
{
   public abstract long Available { get; }
   public abstract byte ReadByte ();
   public abstract void ReadBytes (byte[] bytes, int offset, int count);
   public virtual bool ReadBool ()
   ...
}

public abstract class Scroller
{
   public virtual long MinPosition (Rider r) { return 0; }
   public virtual long MaxPosition (Rider r) { return System.Int64.MaxValue; }
   public abstract long GetPosition (Rider r);
   public abstract void SetPosition (Rider r, long position);
}

public abstract class Buffer
{
   public abstract long Length { get; }
   public abstract Scroller Scroller { get; }
   public abstract Writer NewWriter ();
   public abstract Reader NewReader ();
}
```

то реализация скроллера упростится:
## Код:
```
private sealed class TheScroller: Scroller
{
   private static Locator GetLocator (Rider r)
   {
      Locator loc = r.Locator as Locator;
      if (loc != null) return loc; else throw new System.Exception("Alien rider.");
   }
   public override long MaxPosition (Rider r)
   {
      return GetLocator(r).buffer.length;
   }
   public override long GetPosition (Rider r)
   {
      return GetLocator(r).Position;
   }
   public override void SetPosition (Rider r, long position)
   {
      GetLocator(r).Position = position;
   }
}
```

Извините за C#, в Component Pascal это транслируется практически один в один.