эмуляция множественного наследования
От: sergunok  
Дата: 18.11.10 18:17
Оценка:
Гуру, посоветуйте, как на C# сэмулировать перегрузку виртуального метода базового класса в производном в условиях отсутствия множественного наследования?

В данном примере: как в Y дать свою реализацию OnStart при этом использовать Start из StartableBase?

public interface IStartable
{
  void Start();
}

public class StartableBase : IStartable
{
  void Start
  {
    OnStart();
  }

  protected virtual OnStart()
  {
  }
}

public class X
{
// много всего
}

// Реально хочется множественного наследования: "public class Y : X, StartableBase"
public class Y : X, IStartable
{
// ?
}
Re: эмуляция множественного наследования
От: adontz Грузия http://adontz.wordpress.com/
Дата: 18.11.10 18:27
Оценка:
Здравствуйте, sergunok, Вы писали:

Агрегируй StartableBase
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: эмуляция множественного наследования
От: sergunok  
Дата: 18.11.10 18:41
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, sergunok, Вы писали:


A>Агрегируй StartableBase


Так-с, но я хочу использовать имплементацию Start() из StartableBase и перегрузить OnStart()

т.е. нужно агрегировать объект-наследник от StartableBase (ниже)?

А VS 2010 или какая-нибудь бесплатная тулза к ней такое умеет?

public class Y : X, IStartable
{
private StartableBase startableBase;
public Y()
{
this.startableBase = new StartableBaseY();
}


public void Start()
{
this.startableBase.Start();
}

protected internal void OnStart()
{
// реализация
}

public class StartableBaseY : StartableBase
{
Y y;
public StartableBaseY(Y y)
{
this.y = y;
}
protected override OnStart()
{
y.OnStart();
base.OnStart();
}
}

}
Re[3]: эмуляция множественного наследования
От: Аноним  
Дата: 18.11.10 19:19
Оценка:
Здравствуйте, sergunok, Вы писали:

S>т.е. нужно агрегировать объект-наследник от StartableBase (ниже)?

В стандартной библиотеке практически всегда protected OnXXX методы дергают соответствующие public события.
Поэтому, если изменение StaratableBasе не представляется возможным, я создал бы наследника с публичным событием и аггрегировал бы его с подпиской на это событие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.