

DartでClassを記載しているのですが、継承すると継承元の関数を呼び出せなくなってしまいます。  
こういった場合、どのように管理すればよいでしょうか。

実際の継承元のclass名が長いため、短いClass名でアクセスできるようにしようと思ったのですが、継承するとそもそも元のClassが呼び出せなくなってしまいました。

**エラー内容:**

[code]

    The method 'hogeFunc' isn't defined for the type 'hoge2'.
    Try correcting the name to the name of an existing method, or defining a method named 
    
[/code]

**現状のコード:**

[code]

    class hoge2 extends hoge{}
    
    class hoge{
    
      static void hogeFunc(){
    
      }
    }
    
[/code]


CC BY-SA 4.0
2021-05-26T09:02:42.173
76082
2021-05-29T18:24:32.660
2021-05-26T11:06:32.997
3060
45503
question
dart
Dart言語でClassの継承をすると、継承元の関数が呼び出せない


Dartでは、サブクラス（派生クラス）の型シンボルからスーパークラス（基底クラス）の **静的 (static) メソッド** を呼び出すことはできません。

なお、短い型名を作成するような目的で継承を使うのは間違っています。  
先日リリースされた Dart 2.13
で、非関数型に対する`typedef`型エイリアスが新機能として追加されているので、短縮名を定義したいのであればそちらを使うべきです。

  * [Announcing Dart 2.13. New type aliases language feature… | by Michael Thomsen | Dart | May, 2021 | Medium](https://medium.com/dartlang/announcing-dart-2-13-c6d547b57067)
  * [Type aliases: Typedefs for non-function types · Issue #65 · dart-lang/language](https://github.com/dart-lang/language/issues/65)

[code]

    class SuperClass {
      static void someMethod() {
        print("SuperClass.someMethod() called.");
      }
    }
    
    class SubClass extends SuperClass {
    }
    
    typedef MyTypeAlias = SuperClass;
    
    void main() {
      try {
        SuperClass.someMethod();
        MyTypeAlias.someMethod();
    
        //SubClass.someMethod(); // 誤り。
        //var obj1 = new SuperClass();
        //obj1.someMethod(); // 誤り。
        //var obj2 = new SubClass();
        //obj2.someMethod(); // 誤り。
      } catch(e, stackTrace) {
        print(e);
        print(stackTrace);
      }
    }
    
[/code]

Javaではサブクラスの型シンボルからスーパークラスの静的メソッドを呼び出したり、インスタンスから静的メソッドを呼び出したりすることも一応できますが、これらの記法は非推奨です。ほとんどの静的解析ツールは、こういった呼び出し方をすると警告を出します。

[code]

    class SuperClass {
        static void someMethod() {
            System.out.println("SuperClass.someMethod() called.");
        }
    }
    
    class SubClass extends SuperClass {
    }
    
    public class Main {
        public static void main(String[] args) {
            SuperClass.someMethod();
    
            SubClass.someMethod(); // 非推奨。
            var obj1 = new SuperClass();
            obj1.someMethod(); // 非推奨。
            var obj2 = new SubClass();
            obj2.someMethod(); // 非推奨。
        }
    }
    
[/code]

ちなみに、Dartの公式スタイルガイドでは、型の名前には **UpperCamelCase**
を使うことになっています。このあたりはJavaの慣習と同じです。

  * [Effective Dart: Style | Dart](https://dart.dev/guides/language/effective-dart/style#do-name-types-using-uppercamelcase)

> DO name types using UpperCamelCase.  
>  Classes, enum types, typedefs, and type parameters should capitalize the
> first letter of each word (including the first word), and use no separators.


CC BY-SA 4.0
2021-05-29T18:24:32.660
76179
2021-05-29T18:24:32.660
15413
76082
answer