Я бы предложил дать вашему классу перегруженный конструктор, например:
private readonly string connectionString;
public Foo() : this(Settings.Default.DbConnectionString) {
}
public Foo(string connectionString) {
this.connectionString = connectionString;
}
Тогда производный класс может просто передать «переопределенную» строку соединения в конструктор.
Я думаю, что это чище, чем использование полиморфизма с виртуальным свойством и т. Д., Особенно потому, что предположительно строка подключения не изменится в течение срока службы объекта. Вы на самом деле не изменяете поведение (для чего хорош полиморфизм) - вы изменяете инициализацию (для чего хороши параметры конструктора).