Интерфейсы, вызовы методов.
От: master_of_shadows Беларусь  
Дата: 09.07.04 07:28
Оценка:
Hi All,

Имеем следующую ситуацию:
interface IFoo
{
    void Method1();
}

class Base : IFoo
{
    void IFoo.Method1()
    {
    
    }
}

class Child : Base, IFoo
{
    void IFoo.Method1()
    {
    
    }
}


Как вызвать Base.Method1() из Child? Я такой возможности не нашёл, что очень странно: потомок не может вызвать метод предка .

    ...take a look at the sky, just before you die...
    << RSDN@Home 1.1.3 stable >>
Re: Интерфейсы, вызовы методов.
От: Spaider Верблюд  
Дата: 09.07.04 08:57
Оценка:
Здравствуйте, master_of_shadows, Вы писали:

Может, в твоём случае лучше сделать вот так:

  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
  }
... << RSDN@Home 1.1.3 stable >>
--
К вашим услугам,
Re[2]: Интерфейсы, вызовы методов.
От: master_of_shadows Беларусь  
Дата: 09.07.04 09:09
Оценка:
Здравствуйте, 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 >>
Re: Интерфейсы, вызовы методов.
От: xwalker Россия  
Дата: 10.07.04 10:10
Оценка:
Здравствуйте, master_of_shadows, Вы писали:

...
__>Как вызвать 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();
    }
  }
Re[2]: Интерфейсы, вызовы методов.
От: xwalker Россия  
Дата: 10.07.04 11:02
Оценка:
Здравствуйте, 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();
        }
    }
Re[3]: Интерфейсы, вызовы методов.
От: master_of_shadows Беларусь  
Дата: 12.07.04 07:08
Оценка:
Здравствуйте, 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 >>
Re[4]: Интерфейсы, вызовы методов.
От: wils0n www.atzone.org
Дата: 12.07.04 07:57
Оценка:
Инетресно, что при явном указании

void IFoo.process();


метод определяется как private и естественно он не может быть вызван из базового класса. При неявном же метод можно определить как public и всё работает. Наверное придётся c этим жить.
gcc 4.2
Re: Интерфейсы, вызовы методов.
От: Silver_s Ниоткуда  
Дата: 12.07.04 08:17
Оценка:
Здравствуйте, 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 тоже вызовет переопределенный метод из производного.
Интерфейсная таблица судя по всему одна на весь объект, и получается неявная виртуальность.
А в базовом классе судя по всему медод уже недоступен для вызова никем. Может даже его оптимизатор может выкинуть из кода.
Re[5]: Интерфейсы, вызовы методов.
От: master_of_shadows Беларусь  
Дата: 12.07.04 08:28
Оценка:
Здравствуйте, 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 >>
Re[2]: Интерфейсы, вызовы методов.
От: master_of_shadows Беларусь  
Дата: 12.07.04 08:28
Оценка:
Здравствуйте, 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 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.