Calling a superclass method from any method
    13 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
Hi,
I have a base class:
classdef foo < handle
    function methodA( self )
end
And a base class:
classdef goo < foo
    function methodA( self )
       if ( condition )
           self.methodA@foo();
       else
           other stuff
       end
    end
    function methodB( self )
       self.methodA@foo();
    end
end
Why isn't this possible ?
Every other langage allows it, I do not get the point. Is there any way to get it to work ?
I need A to be the public interface: the framework user is not allowed to bypass the override. However B is framework private, needed for internal management of values. So no, I cannot invert A & B in the child class nor I cannot rename A.
0 comentarios
Respuestas (2)
  Robert U
      
 el 19 de Jul. de 2017
        
      Editada: Robert U
      
 el 19 de Jul. de 2017
  
      Hi Zangdaar,
I am not sure if I got your point correctly. In my understanding you have two base classes where class_B has to invoke a method of class_A. Since I do not know what data you would like to share between the objects I introduce a random property.
Base class A:
 classdef class_A < handle;
   properties
   end
   methods
     function obj = methodA(obj)
       disp('<< Method A of class_A utilized!');
     end
   end
 end
Base class B:
 classdef class_B < handle;
   properties
     classA_Property
   end
   methods
     function obj = methodA(obj)
       disp('<< Method A of class_B utilized!');
       c = clock;
       disp(['<< actual seconds: ',num2str(fix(c(6)))])
       if mod(fix(c(6)),2) == 0
         TmpClassA = class_A;
         TmpClassA.methodA;
         obj.classA_Property = TmpClassA;
       else
         disp('<< methodA in class_B continued.');
       end
     end
        function obj = methodB(obj)
            disp('<< Method B of class_B utilized!');
            obj.methodA;
        end
    end
 end
In that case you create a temporary object of class_A on which you can utilize method_A of class_A that can have the same name as method_A in class_B.
Second option in my opinion is, to use class_A as superclass for class_B_inh_A. In that case it is possible to call the methodA of class_A that is shadowed by methodA of class_B_inh_A. The only thing is that it is not possible to call it from methodB which brings us back to the temporary class_A call:
 classdef class_B_inh_A < class_A;
   properties
     classA_Property;
   end
   methods
     function obj = methodA(obj)
       disp('<< Method A of class_B_inh_A utilized!');
       c = clock;
       disp(['<< actual seconds: ',num2str(fix(c(6)))])
       if mod(fix(c(6)),2) == 0;
         obj.methodA@class_A;
       else
         disp('<< methodA in class_B_inh_A continued.');
       end
     end
     function obj = methodB(obj)
       disp('<< Method B of class_B_inh_A utilized!');
       obj.methodA;
       TmpClassA = class_A;
       TmpClassA.methodA;
       obj.classA_Property = TmpClassA;
     end
   end
 end
Calling class_A method A:
 >> A = class_A;
 >> A.methodA;
<< Method A of class_A utilized!
Calling class B method A:
 >> B = class_B;
 >> B.methodA;
<< Method A of class_B utilized!
<< actual seconds: 45
<< methodA in class_B continued.
 >> B.methodA;
<< Method A of class_B utilized!
<< actual seconds: 52
<< Method A of class_A utilized!
Calling class B method B:
 >> B.methodB;
<< Method B of class_B utilized!
<< Method A of class_B utilized!
<< actual seconds: 24
<< Method A of class_A utilized!
<< Method A of class_A utilized!
 >> B.methodB;
<< Method B of class_B utilized!
<< Method A of class_B utilized!
<< actual seconds: 25
<< methodA in class_B continued.
<< Method A of class_A utilized!
Calling class B_inh_A method A:
 >> B_inh_A = class_B_inh_A;
 >> B_inh_A.methodA;
<< Method A of class_B_inh_A utilized!
<< actual seconds: 45
<< methodA in class_B_inh_A continued.
 >> B_inh_A.methodA;
<< Method A of class_B_inh_A utilized!
<< actual seconds: 46
<< Method A of class_A utilized!
Calling class B_inh_A method B:
 >> B_inh_A.methodB;
<< Method B of class_B_inh_A utilized!
<< Method A of class_B_inh_A utilized!
<< actual seconds: 53
<< methodA in class_B_inh_A continued.
<< Method A of class_A utilized!
 >> B_inh_A.methodB;
<< Method B of class_B_inh_A utilized!
<< Method A of class_B_inh_A utilized!
<< actual seconds: 54
<< Method A of class_A utilized!
<< Method A of class_A utilized!
0 comentarios
Ver también
Categorías
				Más información sobre Function Creation en Help Center y File Exchange.
			
	Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

