none
доступ к переопределенному методу "дедушки" RRS feed

  • Вопрос

  • Здравствуйте! возник такой вопрос: есть система из трех классов следующего вида:

        public class myclass1

        {

            public virtual void MyFunc1()

            {

    ///code1

            }

        }

     

        public class myclass2 : myclass1

        {

    public override void MyFunc1()

            {

    ///code2

            }

        }

     

        public class myclass3 : myclass2

        {

            public override void MyFunc1()

            {

    ///code3

            }

        }

     

    Так вот, вопрос заключается в следующем: возможно ли в code3 вызвать базовую функцию MyFunc1 класса myclass1, а не myclass2? Пытался написать base.base.MyFunc1 - не работает :)

    13 марта 2011 г. 10:20

Ответы

  • Точно невозможно. Хотя бы потому, что нет никакой гарантии, что класс myclass2 не перестанет вдруг наследоваться от myclass1. А myclass3 не накладывает никаких ограничений на родителя myclass2.
    My blog
    • Помечено в качестве ответа Abolmasov Dmitry 15 марта 2011 г. 6:06
    13 марта 2011 г. 11:40
    Модератор

Все ответы

  • Точно невозможно. Хотя бы потому, что нет никакой гарантии, что класс myclass2 не перестанет вдруг наследоваться от myclass1. А myclass3 не накладывает никаких ограничений на родителя myclass2.
    My blog
    • Помечено в качестве ответа Abolmasov Dmitry 15 марта 2011 г. 6:06
    13 марта 2011 г. 11:40
    Модератор
  • Возможно проблема заключается в том, что конструкции с точками типа base.base.MyFunc1  предполагают обращения к существующим к объектам.  Врядли удастся обратиться к нестатическому методу дедушки из класса внука.

    Может быть поможет такая конструкция:

    /********************************************
     Образец проекта: C# -> WindowsFormApplication
     Добавленные классы Class1, Class2, Class3
     -------------------------------------------
     Для проверки:
    1. добавить в конструкторе Form кнопку "button1"
    2. добавить в конструкторе обработчик щелчка по кнопке "button1"
    3. редактировать текст обработчика:
     
      private void button1_Click(object sender, EventArgs e)
      {
       //текст обработчика
       Class1 m1 = new Class1();
       Class1 m2 = new Class2();
       Class1 m3 = new Class3();
       MessageBox.Show(m1.MyFunc() + "\r\n" + m2.MyFunc() + "\r\n" + m3.MyFunc());
      }
     *******************************************/
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace WindowsFormsApplication1_M1
    {
     class Class1
     {
      public virtual string MyFunc()
      {
       return "Class1:MyFunc";
      }
     }
     class Class2 : Class1
     {
      public override string MyFunc()
      {
       return "Class2:MyFunc";
      }
     }
     class Class3 : Class2
     {
      public override string MyFunc()
      {
       Class1 m = new Class1();
       return ("Class3:MyFunc\r\nОт дедушки: " + m.MyFunc());
      }
     }
    }
    

     Если применять статические функции то можно попробовать такую систему классов (С++)

    class Class1
    {
    public:
    	Class1(void){};
    	~Class1(void){};
    	static int MyFunc(){return 1;}
    };
    class Class2 : public Class1
    {
    public:
    	Class2(void){};
    	~Class2(void){};
    	//перегруженная функция
    	int MyFunc(){return 2;}
    };
    class Class3 : public Class2
    {
    public:
    	Class3(void){};
    	~Class3(void){};
    	//перегруженная функция с обращением к дедушке - возвращает 3
    	int MyFunc(){return 2 + Class1::MyFunc();}
    };
    /////////////////////////////////////////////////////////
    // для проверки
    #include <assert.h>
    void Test()
    {
    	int sum;
    	Class1 *m1=new Class1();
    	Class2 *m2=new Class2();
    	Class3 *m3=new Class3();
    	//сложим результаты MyFunc
    	sum =m1->MyFunc();
    	sum+=m2->MyFunc();
    	sum+=m3->MyFunc();
    	delete m1;
    	delete m2;
    	delete m3;
    	//проверка во время исполнения программы
    	assert(sum == (1+2+3));
    }
    13 марта 2011 г. 16:39
  • Создание объекта класса внутри метода - эт уже другое, не то что хотел топикстартер.
    Для связи [mail]
    15 марта 2011 г. 6:06