using System;
public interface IFace
{
void Foo();
}
public class Base : IFace
{
void IFace.Foo()
{
Console.WriteLine("IFace.Foo in Base");
}
}
public class Derived : Base, IFace
{
void IFace.Foo()
{
base.Foo(); // не компилируется
((IFace)base).Foo(); // не компилируется
((IFace)(Base)this).Foo(); // вызыватся метод из класса Derived
Console.WriteLine("IFace.Foo in Derived");
}
}
Попробовал разные варианты (см. выше), но так и не смог вызвать метод из базового класса. Как это сделать?
Здравствуйте, <Аноним>, Вы писали:
А>Попробовал разные варианты (см. выше), но так и не смог вызвать метод из базового класса. Как это сделать?
Я не понял это флэшмоб, что-ли? Уже который день подрят спрашивают, на сделать так чтобы виртуальный метод вел себя как не виртуальный.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, <Аноним>, Вы писали:
А>>Попробовал разные варианты (см. выше), но так и не смог вызвать метод из базового класса. Как это сделать?
L>Я не понял это флэшмоб, что-ли? Уже который день подрят спрашивают, на сделать так чтобы виртуальный метод вел себя как не виртуальный.
Это ведь хорошо, что люди такими важными вещами, как виртуальные методы, заинтересовались!
А тут человек еще не поленился полный код привести и форматирование проставить.
Ай, маладца!
Здравствуйте, Аноним, Вы писали:
А>А>using System;
А>public interface IFace
А>{
А> void Foo();
А>}
А>public class Base : IFace
А>{
А> void IFace.Foo()
А> {
А> Console.WriteLine("IFace.Foo in Base");
А> }
А>}
А>public class Derived : Base, IFace
А>{
А> void IFace.Foo()
А> {
А> base.Foo(); // не компилируется
А> ((IFace)base).Foo(); // не компилируется
А> ((IFace)(Base)this).Foo(); // вызыватся метод из класса Derived
А> Console.WriteLine("IFace.Foo in Derived");
А> }
А>}
А>Попробовал разные варианты (см. выше), но так и не смог вызвать метод из базового класса. Как это сделать?
Я бы сделал так.
public interface IFace
{
void Foo();
}
public class Base : IFace
{
void IFace.Foo()
{
DoFoo();
}
protected virtual void DoFoo()
{
Console.WriteLine("IFace.Foo in Base");
}
}
public class Derived : Base, IFace
{
void IFace.Foo()
{
base.DoFoo();
}
}
Здравствуйте, Аноним, Вы писали:
А>Попробовал разные варианты (см. выше), но так и не смог вызвать метод из базового класса. Как это сделать?
MSDN
.NET Framework Developer's Guide
Implementing Interface Members Explicitly
...............
Do provide a protected virtual member that offers the same functionality as the explicitly implemented member if the functionality is meant to be specialized by derived classes.
Explicitly implemented members cannot be overridden. If they are redefined in a derived class, it is impossible for the derived class to call the base class implementation. You should name the protected member by either using the same name as the explicit interface member or affixing Core to the interface member name.
Таким образом, Microsoft говорит нам, что поставленную Вами задачу выполнить нельзя (it is impossible for the derived class to call the base class implementation). Самый простой способ обойти это ограничение: ввести дополнительный protected virtual метод,
как показал stumpАвтор: stump
Дата: 20.09.06
и как обясняется в цитате выше.
Несмотря на то, что метод базового класса недоступен, он все равно наследуется и присутствует в наследниках. Значит, его можно вызвать через отражение.
using System;
using System.Runtime.Serialization;
public interface IFace
{
void Foo();
}
public class Base : IFace
{
void IFace.Foo()
{
Console.WriteLine("IFace.Foo in Base");
}
}
public class Derived : Base, IFace
{
private delegate void FooDelegate();
private static readonly FooDelegate _foo = ((IFace)FormatterServices.GetUninitializedObject(typeof(Base))).Foo;
void IFace.Foo()
{
((FooDelegate)Delegate.CreateDelegate(typeof (FooDelegate), this, _foo.Method))();
Console.WriteLine("IFace.Foo in Derived");
}
}
public class Program
{
public static void Main()
{
IFace face = new Derived();
face.Foo();
}
}
Если честно, то не совсем понятно зачем такая конструкция нужна, либо все делай через виртуальные мотоды, либо сделай так
public class Derived : Base
{
public void Foo()
{
((IFace)this).Foo(); // вызыватся метод из класса Base
Console.WriteLine("IFace.Foo in Derived");
}
}
Derived class1 = new Derived();
(class1 as IFace).Foo(); // напрямую из Base
class1.Foo();
pulbic class Maxim.Krupoderov
{
public string ICQ
{ return "121513591"; }
}
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Здравствуйте, m.krupoderov, Вы писали:
MK> MK> (class1 as IFace).Foo(); // напрямую из Base
MK>
Ай, нехорошо такие примеры для молодежи оставлять. Вот человек посмотрит на такой код и не подумает, что он здесь только ради примера написан. И будут потом NullReference ошибки в логах торчать, вместо внятной ошибки приведения...