You need to sign in to do that
Don't have an account?
MikeGinou
Cannot call overriden protected virtual methods from superclass?
Is this an Apex bug, documented limitation, or am I just crazy to think that the following should be possible?
Here is a simple example demonstrating an example of attempting to call an overridden implementation of a protected method from a superclass. I've set the example as three separate class files:
Parent Class:
public virtual class TestParent { private string data = 'Parent Data'; protected virtual string getData() { return this.data; } public string getText() { // This is where the Overwritten child method gets called! return 'Data : ' + this.getData(); } }
Child Class:
public class TestChild extends TestParent { private string myData = 'Child Data'; protected override string getData() { return super.getData() + ' and ' + myData; } }
Test Class:
@isTest private class inheritancetest { static testmethod void testUseChild() { try { TestChild c = new TestChild(); c.getText(); } catch (Exception e) { System.Assert( false, 'Exception! ' + e.getMessage() ); } } static testmethod void testUseParent() { try { TestParent p = new TestChild(); p.getText(); } catch (Exception e) { System.Assert( false, 'Exception! ' + e.getMessage() ); } } }
I was expecting the test methods to pass without any issues, instead they fail because "[TestChild].getData() is not accessible", (a line number indicating Test.Parent.getText()'s code statement is provided).
According to the Apex Developer's Guide:
---
protected
This means that the method or variable is visible to any inner classes in the defining Apex class.
---
Thus it sounds like what you are experiencing is correct behaviour.
All Answers
According to the Apex Developer's Guide:
---
protected
This means that the method or variable is visible to any inner classes in the defining Apex class.
---
Thus it sounds like what you are experiencing is correct behaviour.
I did read that at one point, however, protected methods in the super class are callable by sub classes (I don't have examples of that in the code chunk posted), so the Apex documentation is being a little coy and not sharing the whole truth.