Hi Stephen,

> On Jun 26, 2024, at 4:26 AM, Stephen Reay <php-li...@koalephant.com> wrote:
> 
> This is an example of code that works today (and all the way back to 5.0): 
> https://3v4l.org/4EKo2 <https://3v4l.org/4EKo2>
> 
> The class hierarchy embody the type of classes this RFC is about: only static 
> members, no instantiation. 
> 
> The *implemented methods* can be called statically, regardless of whether the 
> class they're implemented in is abstract or not. The *abstract methods* 
> cannot be called directly.
> 
> So these classes would be a candidate for the `static` class keyword (or 
> Attribute) - except they can't, if calls to implemented methods on abstract 
> classes are disallowed. Because the Base::a() method has been publicly 
> callable, for potentially as long as <checks notes>  20 years next month.
> 
> My point here is that if someone wants to prohibit calling public static 
> methods on abstract classes *with* the static keyword, that's going be 
> inconsistent with how it's worked for the last 20 years (i.e. on classes that 
> were 'static' in intent but not syntactically), or if it applies the change 
> everywhere it's going to be a BC break.

It seems what you are asking about is downstream from the reason I stated that 
I made the argument in the first place, which AFAICT you did not acknowledge. 
That leaves me unsure of your position on a precursor topic to your above 
stated objections.

As stated, my primary (initial) reason for arguing that `abstract static` 
should disallow calling static methods using the class name of the static class 
marked abstract — as my earlier example of calling `Base::foo()` illustrated` — 
was in response to the argument against allowing `abstract` with `static` 
because — in Claude's words — it would "have no real semantic meaning for 
static class; their effects on static members are only consequences of their 
intended meaning on non-static class."  I have copied his complete words on 
that topic below:

> On Jun 24, 2024, at 4:27 AM, Claude Pache <claude.pa...@gmail.com> wrote:
> 
> Should a static class be marked `abstract`? I think not, because those have 
> no real semantic meaning for static class; their effects on static members 
> are only consequences of their intended meaning on non-static class:
> 
> * The main purpose of the `abstract` keyword is to prevent a class to be 
> instantiated, which (in case of static class) is more semantically described 
> by the `static` marker. Beyond that, it just allows to declare a method that, 
> if implemented by a subclass, should have a compatible signature. Most 
> notably, it does not prevent the other static members of the class to be used 
> directly.

Thus my argument supporting `abstract static` was addressing his objections by 
suggesting that we could have an `abstract static class` declaration *disallow* 
calling any of the `static` methods of the class using the name of the class 
declared `abstract` given that it would in fact not cause any BC breaks with 
untouched code. 

Before you repeat your objections to disallowing, permit me to ask you which of 
the following upstream arguments you are making?  Is your position that we 
should:

1. Disallow `abstract` on `static` as Claude argued?
2. Allow `abstract static` in spite of  Claude's argument against it?

Also, if you answer "2. Allow `abstract static`" then please how do you address 
Claude's objections?

Once I am clear of your position on two above I will address your objections 
stated in your most recent response to me, which I quoted at the beginning of 
this email.  Thank you in advance for the clarity.

-Mike

Reply via email to