search
テクノロジー

Flutterのsuperをタクティクスオウガのクラスチェンジをイメージして学んでみた

Semapho's icon'
  • Semapho
  • 2021/09/12 13:30

Flutter superをタクティクスオウガのステータス値(超簡易)で学んでみた

Content image

 

分かりそうで、分からないsuperの使い方を学ぶ

本稿、あるいは本シリーズはFlutterの公式ドキュメントを参考に初学者が理解を深めるものである。

superってなんだ。なぜ使うんだろう、という疑問が今も浮かびながら本稿を執筆している。例えば、FlutterのデモコードではStatefulWidgetを継承したMyHomePageに子クラスのコンストラクタの他に、super(key: key)なるものが記述されている。

 

初学者としてはこのsuperがなんなのか理解を深めなければ、コードが何を指すのか分からない場面が多々出てくる。

 

class MyHomePage extends StatefulWidget {
 MyHomePage({Key? key, required this.title}) : super(key: key);

 final String title;

 @override
 _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
 int _counter = 0;

 void _incrementCounter() {
   setState(() {
     _counter++;
   });
 }
 @override
 Widget build(BuildContext context) {
 ...
以下略

 

MyHomePageはStatefulWidgetを継承している。ということはMyHomePageクラスはStateful Widgetの子クラスで、StatefulWidgetはMyHomePageクラスの親クラスということになる。そして、superは親クラスのコンストラクタを呼び出すことができるものである。

上記のコードでは、MyHomePageクラスのコンストラクタにはkeyというパラメータがある。ここで受け取ったkeyを親クラス(StatefulWidget)に受け渡しているのだ。しかし、実際には上記コードではkeyはnullであるという(正直Keyの使い方が分からなくて、困っているがその解説は本稿の趣旨から外れるため後日調べる)。とにかく、本稿ではsuperは親クラスのコンストラクに引数を受け渡していると説明する。

superを使ってみる

では、なぜsuperが必要なのか。

例えば、『タクティクスオウガ』の主人公デニムは他のキャラと同様、クラスチェンジができる。デフォルトのソルジャーから、ナイトにクラスチェンジした際、ステータスに変化が生じるが、そのステータスの増減はデニムの元のステータスを参照しなければならない。

つまり、他のキャラがナイトになるのと、デニムがナイトになるのではそれぞれステータスが違って当然だ。今回はそのデニムのステータスをsuperを使って表現してみた。

以下のコードは一応、現在の理解力で記述したもので、2021年9月11日現在、動作を確認している。しかし、もっと良い書き方があるかもしれない。

 

void main() {
 Knight knight = Knight(speed: -10, power: 20, vital: 6);
 knight.knightStatus();
 knight.denimWords();
}

//親クラスの定義
class Denim {
 int denimSpeed = 3; //デニムの元々のスピード
 int classSpeed; //デニムのクラスによるスピード補正

 int denimPower = 5; //デニムの元々の力
 int classPower; //デニムのクラスによる力補正

 int denimVital = 3; //デニムの元々の体力
 int classVital; //デニムのクラスによる体力補正

 Denim({required this.classSpeed, required this.classPower, required this.classVital}) {}

 void denimWords() {
   print('馬鹿なことはやめるんだッ!');
 }
}

//子クラスの定義
class Knight extends Denim {
 //親クラスのコンストラクタを使用
 Knight({required int speed, required int power, required int vital}) : super(classSpeed: speed, classPower: power, classVital: vital) {}

 void knightStatus() {
   print('デニムのスピードは${super.denimSpeed + super.classSpeed}');
   print('デニムの力は${super.denimPower + super.classPower}');
   print('デニムの体力は${super.denimVital + super.classVital}');
 }

 @override
 void denimWords(){
   print('……わかっています。');
 }
}

子クラスKnightは親クラスである、Denimを参照しており、自身のコンストラクタで引数として受け取ったspeed等のステータスをsuperを使いDenimクラスのコンストラクタを呼び出している。そして、classSpeed等、各ステータスに渡しているのだ。

そして、knightStatus()では元々のステータスとKnightのステータス増減の合計値を出力させている。

ちなみに、Knightクラス内の @override 以下の denimWords()は親クラスであるDenimのセリフを上書きしている(原作を知っている人からすれば、なんでナイトになったらロールートに行くことになってるのだとツッコミたくなるだろうが)。

これをさらに利用するならば、クラスごとにステータスを変化させることだってできるし、戦闘中のセリフを変えたり、死亡時の処理を変化させることもできる。

親クラスの元々の処理を活かすことで、処理の方向性が散らばらずに済むような気がした(あくまでも最後は親クラスのコンストラクタに引き渡して、インスタンス生成時に処理してもらう)。

参考: https://flutternyumon.com/how-to-use-class-inheritance/

 

Article tip 0人がサポートしています
獲得ALIS: Article like 2.39 ALIS Article tip 0.00 ALIS
Article registration Article registration
Semapho's icon'
  • Semapho
  • @Semapho
海外のゲーム開発スタジオと契約中のフリーランス広報。音楽にも精通しており、楽器ならなんでも弾く。20代半ばで指を切断する事故に遭い、音楽へ固執していたことに気づく。その後、言葉のプロになった。

投稿者の人気記事
コメントする
コメントする
こちらもおすすめ!
Eye catch
クリプト

約2年間ブロックチェ-ンゲームをして

kaya 2021/10/06
Like token Tip token
61.20 ALIS
Eye catch
クリプト

ジョークコインとして出発したDogecoin(ドージコイン)の誕生から現在まで。注目される非証券性🐶

昆布森ちゃん 2021/01/19
Like token Tip token
38.31 ALIS
Eye catch
テクノロジー

なぜ、素人エンジニアの私が60日間でブロックチェーンゲームを制作できたのか、について語ってみた

ゆうき 2020/08/12
Like token Tip token
270.93 ALIS
Eye catch
クリプト

Bitcoinの価値の源泉は、PoWによる電気代ではなくて"競争原理"だった。

CryptoChick 2020/03/07
Like token Tip token
159.32 ALIS
Eye catch
クリプト

Uniswap v3を完全に理解した

池田らいく 2021/04/04
Like token Tip token
18.92 ALIS
Eye catch
クリプト

Bitcoin史 〜0.00076ドルから6万ドルへの歩み〜

大田コウキ 2021/04/06
Like token Tip token
947.13 ALIS
Eye catch
ゲーム

ドラクエで学ぶオーバフロー

keiju togashi 2020/03/12
Like token Tip token
30.10 ALIS
Eye catch
クリプト

NFT解体新書・デジタルデータをNFTで販売するときのすべて【実証実験・共有レポート】

otakucoin 2021/03/29
Like token Tip token
121.79 ALIS
Eye catch
テクノロジー

オープンソースプロジェクトに参加して自己肯定感を高める

おはぐろ氏 2020/02/15
Like token Tip token
85.05 ALIS
Eye catch
テクノロジー

彼女でも分かるように解説:ディープフェイク

Jimmy 2020/03/17
Like token Tip token
32.10 ALIS
Eye catch
他カテゴリ

ALISのシステム概観

ALISブロックチェーンブログ 2018/07/03
Like token Tip token
5.00 ALIS
Eye catch
他カテゴリ

機械学習を体験してみよう!(難易度低)

nonstop-iida 2020/03/04
Like token Tip token
124.82 ALIS