public interface IFoo
{
void Bar();
}
public class Base : IFoo
{
#region IFoo Members
public virtual void Bar()
{
Console.WriteLine ("I'm big boss class");
}
#endregion
}
public class Child : Base, IFoo
{
#region IFoo Members
public override void Bar()
{
base.Bar();
Console.WriteLine ("I'm child class");
}
#endregion
}
Здравствуйте, Spaider, Вы писали:
S>Здравствуйте, master_of_shadows, Вы писали:
S>Может, в твоём случае лучше сделать вот так:
S>
S> public interface IFoo
S> {
S> void Bar();
S> }
S> public class Base : IFoo
S> {
S> #region IFoo Members
S> public virtual void Bar()
S> {
S> Console.WriteLine ("I'm big boss class");
S> }
S> #endregion
S> }
S> public class Child : Base, IFoo
S> {
S> #region IFoo Members
S> public override void Bar()
S> {
S> base.Bar();
S> Console.WriteLine ("I'm child class");
S> }
S> #endregion
S> }
S>
В каких-то случаях да, но не во всех. Я имел ввиду те, не все случаи...
Более того, вопрос не в том как лучше, а в том как принипиально можно вызвать метод баозвого класса из потомка (смешно да).
...take a look at the sky, just before you die...<< RSDN@Home 1.1.3 stable >>
... __>Как вызвать Base.Method1() из Child? Я такой возможности не нашёл, что очень странно: потомок не может вызвать метод предка .
Преобразуем Child к Base и вызываем:
public interface IFoo
{
void process();
}
public class Base: IFoo
{
public void process()
{
System.Windows.Forms.MessageBox.Show("base");
}
}
public class Child: Base, IFoo
{
public new void process()
{
System.Windows.Forms.MessageBox.Show("child");
}
public void process1()
{
((Base)this).process();
}
}
Здравствуйте, xwalker, Вы писали:
X>Здравствуйте, master_of_shadows, Вы писали:
...
В догонку к предыдущему посту.
А вам обязательно нужна ЯВНАЯ реализация интерфейсов?
void IFoo.Method1()
...
У меня получилось заставить работать ваш пример (пред. пост) только при обычной реализации интерфейса.
То есть в след. коде вызов метода process1 все равно печатает child!
public interface IFoo
{
void process();
}
public class Base: IFoo
{
void IFoo.process()
{
System.Windows.Forms.MessageBox.Show("base");
}
}
public class Child: Base, IFoo
{
void IFoo.process()
{
MessageBox.Show("child");
}
public void process1()
{
((this as Base) as IFoo).process();
}
}
Здравствуйте, xwalker, Вы писали:
X>Здравствуйте, xwalker, Вы писали:
X>>Здравствуйте, master_of_shadows, Вы писали: X>... X>В догонку к предыдущему посту. X>А вам обязательно нужна ЯВНАЯ реализация интерфейсов?
Да. В том то и дело.
X>
X>void IFoo.Method1()
X>...
X>
X>У меня получилось заставить работать ваш пример (пред. пост) только при обычной реализации интерфейса. X>То есть в след. коде вызов метода process1 все равно печатает child! X>
X> public interface IFoo
X> {
X> void process();
X> }
X> public class Base: IFoo
X> {
X> void IFoo.process()
X> {
X> System.Windows.Forms.MessageBox.Show("base");
X> }
X> }
X> public class Child: Base, IFoo
X> {
X> void IFoo.process()
X> {
X> MessageBox.Show("child");
X> }
X> public void process1()
X> {
X> ((this as Base) as IFoo).process();
X> }
X> }
X>
Вот именно в этом то и проблемма. После явной реализации интерфейса нет возможности (я не нашёл) вызвать метод базового класса. Что есть очень странно.
...take a look at the sky, just before you die...<< RSDN@Home 1.1.3 stable >>
метод определяется как private и естественно он не может быть вызван из базового класса. При неявном же метод можно определить как public и всё работает. Наверное придётся c этим жить.
Здравствуйте, master_of_shadows, Вы писали: __>Как вызвать Base.Method1() из Child? Я такой возможности не нашёл, что очень странно: потомок не может вызвать метод предка .
Фишка в том что даже сам базовый класс не сможет вызвать свой метод, если он явно приписан к интерфейсу
public class Base: IFoo
{
void IFoo.process()
{
System.Windows.Forms.MessageBox.Show("base");
}
public void Test()
{
(this as IFoo).process();
}
}
Здесь Test тоже вызовет переопределенный метод из производного.
Интерфейсная таблица судя по всему одна на весь объект, и получается неявная виртуальность.
А в базовом классе судя по всему медод уже недоступен для вызова никем. Может даже его оптимизатор может выкинуть из кода.
Здравствуйте, wils0n, Вы писали:
W>Инетресно, что при явном указании
W>
W>void IFoo.process();
W>
W>метод определяется как private и естественно он не может быть вызван из базового класса. При неявном же метод можно определить как public и всё работает. Наверное придётся c этим жить.
Метод не private. Т.к. можно привести к интерфейсу и вызвать его.
А жить походу придётся .
...take a look at the sky, just before you die...<< RSDN@Home 1.1.3 stable >>
Здравствуйте, Silver_s, Вы писали:
S_>Здравствуйте, master_of_shadows, Вы писали: __>>Как вызвать Base.Method1() из Child? Я такой возможности не нашёл, что очень странно: потомок не может вызвать метод предка .
S_> Фишка в том что даже сам базовый класс не сможет вызвать свой метод, если он явно приписан к интерфейсу
S_>
S_>public class Base: IFoo
S_>{
S_> void IFoo.process()
S_> {
S_> System.Windows.Forms.MessageBox.Show("base");
S_> }
S_> public void Test()
S_> {
S_> (this as IFoo).process();
S_> }
S_>}
S_>
S_> Здесь Test тоже вызовет переопределенный метод из производного. S_> Интерфейсная таблица судя по всему одна на весь объект, и получается неявная виртуальность. S_> А в базовом классе судя по всему медод уже недоступен для вызова никем. Может даже его оптимизатор может выкинуть из кода.
Наверное так и есть. Ну оптимизатор его никуда не выкинет. Иначе что будет JIT вызывать у экземпляра базового класса .
...take a look at the sky, just before you die...<< RSDN@Home 1.1.3 stable >>