Skip to content

Instantly share code, notes, and snippets.

@theanurin
Last active October 6, 2023 19:47
Show Gist options
  • Save theanurin/d98255fc9f90e404c1df34f8feab076a to your computer and use it in GitHub Desktop.
Save theanurin/d98255fc9f90e404c1df34f8feab076a to your computer and use it in GitHub Desktop.
Static member difference across languages

Static member difference across languages

Visibility via inherit class

// C++
#include <iostream>

class A {
public:
    static void bump() { std::cout << "bumpA" << "!\n"; }
};
class B : public A {
public:
    static void bump() { std::cout << "bumpB" << "!\n"; }
};
class C : public B {
};

int main()
{
  A::bump(); // bumpA
  B::bump(); // bumpB
  C::bump(); // bumpB
}
// C#
using System;
	
class A {
  public static void bump() { Console.WriteLine("bumpA"); }
}

class B : A {
  public static void bump() { Console.WriteLine("bumpB"); }
}

class C : B {
}

public class Program
{
	public static void Main()
	{
	  A.bump(); // bumpA
  	  B.bump(); // bumpB
  	  C.bump(); // bumpB
	}
}
// C#
using System;
	
interface A {
    public static void bump() { Console.WriteLine("bumpA"); }	
}

interface B : A { }

class C : B {
}

public class Program
{
	public static void Main()
	{
	    A.bump(); // OK
  	    B.bump(); // OK
  	    C.bump(); // ERROR: 'C' does not contain a definition for 'bump'
	}
}
// Dart
class A {
  static void bump() { print("bumpA"); }
}
class B extends A {
  static void bump() { print("bumpB"); }
}
class C extends B {}

void main() {
  A.bump(); // bumpA
  B.bump(); // bumpB
  C.bump(); // ERROR: The method 'bump' isn't defined for the type 'C'.
}
// Java
class A {
  public static void bump() { System.out.println("bumpA"); }
}

class B extends A {
  public static void bump() { System.out.println("bumpB"); }
}

class C extends B {
}

public class MyClass {
  public static void main(String args[]) {
    A.bump(); // bumpA
    B.bump(); // bumpB
    C.bump(); // bumpB
  }
}
// TypeScript
class A {
  public static bump(): void { console.log("bumpA"); }
}
class B extends A {
  public static bump(): void { console.log("bumpB"); }
}
class C extends B { }

function main(): void {
  A.bump(); // bumpA
  B.bump(); // bumpB
  C.bump(); // bumpB
}

main();

"Override" static methods

// C++
#include <iostream>

class A {
public:
    static int bump(int value) { std::cout << "bumpA" << "!\n"; return value; }
};
class B : public A {
public:
    static const char* bump(const char* value) { std::cout << "bumpB" << "!\n";; return value; }
};

int main()
{
  A::bump(42);
  B::bump("nope");
}
// C#
using System;
	
class A {
	public static int bump(int value) { Console.WriteLine("bumpA"); return value; }
}

class B : A {
	public static string bump(string value) { Console.WriteLine("bumpB"); return value; }
}


public class Program
{
	public static void Main()
	{
		A.bump(42); // bumpA
		B.bump("nope"); // bumpB
		B.bump(43); // bumpA
	}
}
// C#
using System;
	
interface A {
	public static int bump(int value) { Console.WriteLine("bumpA"); return value; }	
}

interface B : A {
	public static string bump(string value) { Console.WriteLine("bumpB"); return value; }	
}


public class Program
{
	public static void Main()
	{
		A.bump(42); // bumpA
		B.bump("nope"); // bumpB
		B.bump(43); // bumpA
	}
}
// Dart
class A {
  static int bump(int value) { print("bumpA"); return value; }
}
class B extends A {
  static String bump(String value) { print("bumpB"); return value; }
}

void main() {
  A.bump(42); // bumpA
  B.bump("nope"); // bumpB
  B.bump(43); // ERROR: The argument type 'int' can't be assigned to the parameter type 'String'.
}
// Java
class A {
  public static int bump(int value) { System.out.println("bumpA"); return value; }
}

class B extends A {
  public static String bump(String value) { System.out.println("bumpB"); return value; }
}

public class MyClass {
  public static void main(String args[]) {
    A.bump(42); // bumpA
    B.bump("nope"); // bumpB
    B.bump(43); // bumpA
  }
}
// TypeScript
class A {
  public static bump(value: number): number { console.log("bumpA"); return value; }
}
class B extends A { // ERROR: Class static side 'typeof B' incorrectly extends base class static side 'typeof A'.
  public static bump(value: string): string { console.log("bumpB"); return value; }
}

function main(): void {
  A.bump(42); // incompilable
  B.bump("nope"); // incompilable
  B.bump(43); // ERROR: Argument of type 'number' is not assignable to parameter of type 'string'.
}

main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment