D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 7726 - 'virtual' keyword please
Summary: 'virtual' keyword please
Status: RESOLVED DUPLICATE of issue 11616
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P2 enhancement
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-03-18 05:59 UTC by Manu
Modified: 2014-02-12 12:58 UTC (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Manu 2012-03-18 05:59:22 UTC
Used in conjunction with 'final:' at the top of the class, gives access to explicit virtual code.
Allow implementation of such a policy for a large code team.
Comment 1 Piotr Szturmaj 2012-03-18 13:07:32 UTC
Instead, please use final: at the bottom of the class.
Comment 2 Manu 2012-03-19 04:09:50 UTC
Then I can't use private:, since that suffers from the same problem of not having a corresponding 'public'.

{
  [public virtual methods]

private:
  [data members]

final:
  [non-virtual methods] // are now private
}


{
  [public virtual methods]

final:
  [non-virtual methods]

private:
  [data members] // error because of the 'final:' bug
}



This all leads to messy, and rather difficult to follow classes. I like to keep associated stuff together.
I also really like the virtual keyword, it states in the API clearly how to extend the class, and you can grep for it.
Comment 3 Piotr Szturmaj 2012-03-19 05:08:26 UTC
You can tag individual members with public/private and final. final: and final { } are just for convenience.

You can also try something like this:

{
    void virtualMethod() {}

private:
    int privateMember;

public final:
    void finalMethod() { } // public
}

I guess you are opting for virtual: keyword to just disable existing final: specifier. There are other possible solutions without adding a new keyword:

- Use default: to restore public and virtual.
- Use negation, like !final: to disable specifiers that differ from public and virtual.

But I'm ok with current approach.
Comment 4 Manu 2012-03-19 06:25:25 UTC
No actually, I want a 'virtual' keyword to write in front of virtual methods. Not 'virtual:', I don't believe that would be very useful.

What I want is the ability to work exactly the same way C++,C# is, and how every programmer that exists expects:

class MyClass
{
final:
this()
  void method();

  @property void thing(int t) {}
  @property int thing() {}


}
Comment 5 Manu 2012-03-19 06:33:04 UTC
*crap, I tapped tab and the 'commit' button gained focus, and when I pressed space bar, it posted.*

class MyClass
{
final:
  this();

  @property void property1(int t)
  @property int property1()

  @property void thing(int t)
  @property int thing()
  void doThing()

  void addUnrelated(Unrelated x);
  Unrelated getUnrelated();
  virtual void updateUnrelateds();

  // etc. 

private:
  virtual void update();
  virtual void draw();

  void handlerDelegate();
  void handlerDelegate2();

  int data1;
  float data2;
  ...
}

Ie. logically group stuff, mark the occasional virtual explicitly, continue as final.

This looks like a fairly realistic class to me. I really want to be able to explicitly mark each function that is virtual in this way.
Comment 6 Piotr Szturmaj 2012-03-19 07:00:07 UTC
You can write it like this:

class MyClass
{
final {
  this();

  @property void property1(int t)
  @property int property1()

  @property void thing(int t)
  @property int thing()
  void doThing()

  void addUnrelated(Unrelated x);
  Unrelated getUnrelated();
}
  void updateUnrelateds();

  // etc. 

private:
  void update();
  void draw();

final {
  void handlerDelegate();
  void handlerDelegate2();
}

  int data1;
  float data2;
  ...
}

IMHO it makes no sense to introduce virtual keyword since virtual in D is the default...
Comment 7 Manu 2012-03-19 10:02:13 UTC
Yeah, I'll do that in the mean time, but it's not a 'solution'.

I still can't grep for virtual (important). And it's really ugly; breaks indentation policy, separates things in and out of braces.
D is meant to be cleaner and tidier than C++. Certainly not messier.
Comment 8 timon.gehr 2012-03-21 12:45:15 UTC
(In reply to comment #4)
> What I want is the ability to work exactly the same way C++,C# is, and how
> every programmer that exists expects:
> 

I'd be careful with strong/wrong statements of this kind. They make your argument seem feeble even if it is not.
Comment 9 Andrej Mitrovic 2014-02-12 12:58:06 UTC

*** This issue has been marked as a duplicate of issue 11616 ***