www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 2525] New: override of function from abstract base class's interface

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2525

           Summary:  override of function from abstract base class's
                    interface
           Product: D
           Version: 1.038
          Platform: Other
        OS/Version: Linux
            Status: NEW
          Keywords: rejects-valid
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla digitalmars.com
        ReportedBy: diggory.hardy gmail.com


interface I
{
        void foo();
}
abstract class A : I
{
}
class B : A
{
        override void foo () {}
}

The above code fails to compile:
overrideBaseInterface.d(10): function overrideBaseInterface.B.foo does not
override any function

It looks to me like B.foo is overriding I.foo and hence the override keyword
should be valid.


-- 
Dec 19 2008
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2525




PST ---
DMD Git head:
https://github.com/D-Programming-Language/dmd/commit/13b3bdbf3819fec810ebfb077957510612dfa815
--------------------
test.d(10): Error: function test.B.foo does not override any function, did you
mean to override 'test.I.foo'?
--------------------
Yes, I did!

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 05 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2525


Andrej Mitrovic <andrej.mitrovich gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |andrej.mitrovich gmail.com



15:01:41 PDT ---
Technically you're not overriding, you're implementing. I think there is no bug
here. I also think the following should be an error:

-----
interface I
{
    void foo();
}

class C : I
{
    override void foo () {}  // no error here currently
}
----

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 06 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2525




PDT ---
I think `override` keyword is useful to mark the methods that are supposed to
be declared elsewhere.

In the following example I'm also (technically) implementing:
--------------------
abstract class A
{
    void foo();
}
class B : A
{
    void foo () {}
}
--------------------
test.d(7): Deprecation: overriding base class function without using override
attribute is deprecated (test.B.foo overrides test.A.foo)
--------------------

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 06 2013
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2525


Dicebot <public dicebot.lv> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |public dicebot.lv




 Technically you're not overriding, you're implementing. I think there is no bug
 here. I also think the following should be an error:
 
 -----
 interface I
 {
     void foo();
 }
 
 class C : I
 {
     override void foo () {}  // no error here currently
 }
 ----
Voting up this bug report. Semantical difference between overriding and implementing is very subtle here. One can also say that it overrides function with empty implementation. However, what does matter here is pragmatical usability it brings to the table. http://dlang.org/attribute.html#override
 The override attribute applies to virtual functions. It means that the
 function must override a function with the same name and parameters in a base
 class. The override attribute is useful for catching errors when a base
 class's member function gets its parameters changed, and all derived classes
 need to have their overriding functions updated. 
This description does miss one important use case - verifying that you do not introduce a new function symbol in the class hierarchy. Consider this example: in the process of wild refactoring interface signature changes and dependent classes get modified. A sloppy programmer works on new implementation of that functions and forgets that there is already existing one. However, code compiles and works, polluting sources with unused function body. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 07 2013
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2525




13:17:16 PDT ---

 A sloppy programmer works on new implementation of that
 functions and forgets that there is already existing one. However, code
 compiles and works, polluting sources with unused function body.
I agree 'override' adds to the readability, however D already protects you against function hiding and function hijacking. For example: ----- class A { void foo() { } } class B : A { void foo() { } } ----- test.d(10): Deprecation: overriding base class function without using override attribute is deprecated (test.B.foo overrides test.A.foo) I don't know why I wrote http://d.puremagic.com/issues/show_bug.cgi?id=2525#c2, I do believe override makes the code more readable. Ideally we would have an "implements" keyword, but you know, keyboard bloat and all that. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 07 2013