// Собственно, сам интерфейс оповещений
public interface INotification
{
void Notify(string text);
}
public class EmailNotification : INotification
{
public void Notify(string text)
{
// код по отправке почты
}
}
public class SmsNotification : INotification
{
public void Notify(string text)
{
// код по отправке смс
}
}
// ... Еще какие-нибудь классы оповещений
// В каком-нибудь классе, где может появиться ошибка
public class MaybeErrorClass
{
private INotification _notification;
public MaybeErrorClass(INotification notification)
{
// Класс не должен знать, по какому каналу оповещать об ошибках.
// Он работает с абстракцией
this._notification = notification;
}
// Очень простой пример метода, в котором ожидаем генерацию ошибки
public void DoSomething()
{
try {
// какой-то блок, в котором можем получить ошибку
}
catch (Exception e)
{
this._notification.Notify("А у нас тут ошибка!");
}
}
}
var maybeErrorEmail = new MaybeErrorClass(new EmailNotification());
var maybeErrorSms = new MaybeErrorClass(new SmsNotification());
Часто ли вы используете интерфейсы?
Часто ли у вас было что ваши репозитории окруженные интерфейсами используют MSSQL, и есть еще такие же репозитории но уже использующие к примеру MongoDB, и где нито вы подменяете одно другим?
interface ILoginForm
{
void WebDocumentLoaded(System.Windows.Forms.WebBrowser webBrowser, Uri url);
}
if (typeof(ILoginForm).IsAssignableFrom(this.GetType()))
{
this.CanLogin = false;
Debug.WriteLine("ILoginForm", "LoginForm");
((ILoginForm)this).WebDocumentLoaded(this.webBrowser1, e.Url);
}
export interface ILocalization {
Loading: string;
LoadingFileContents: string;
// ...
}
export class RU implements ILocalization {
public Loading: string = 'Загрузка...';
public LoadingFileContents: string = 'Получение содержимого файла...';
// ...
}
interface IDBClient
{
public function ExecuteNonQuery();
public function ExecuteScalar();
public function GetRow();
// ...
}
// реализация метода ToInt32
public int ToInt32(IFormatProvider provider)
{
// если пусто, возвращаем ноль
if (!this.HasValue) { return 0; }
// если что-то есть, извлекаем числа и пробуем вернуть int32
return Convert.ToInt32(OAuthUtility.GetNumber(this.Data));
}
public bool SupportRevokeToken { get; protected set; }
public bool SupportRefreshToken { get; protected set; }
public GoogleClient(string clientId, string clientSecret) : base(/*...*/)
{
// ...
base.SupportRevokeToken = true;
base.SupportRefreshToken = true;
}
export interface ILoginState {
Username?: string;
Password?: string;
// ...
}
export default class Index extends Page<any, ILoginState> {
constructor() {
this.state = {
Username: '',
Password: ''
};
}
// ...
}
public interface IDataAccess{
void Connection();
void BeginTransaction();
}
public class MySqlDal:IDataAccess{
public void Contection(){
//TODO implement method!
}
public void BeginTransaction(){
//TODO implement method!
}
}
public class MsSqlDal:IDataAccess{
public void Contection(){
//TODO implement method!
}
public void BeginTransaction(){
//TODO implement method!
}
}
public IDataAccess mySqlDal = new MySqlDal();
public IDataAccess msSqlDal = new MsSqlDal();