テクノロジー

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
Semapho's icon'
  • Semapho
  • @Semapho
海外のゲーム開発スタジオと契約中のフリーランス広報。音楽にも精通しており、楽器ならなんでも弾く。20代半ばで指を切断する事故に遭い、音楽へ固執していたことに気づく。その後、言葉のプロになった。

投稿者の人気記事
コメントする
コメントする
こちらもおすすめ!
Eye catch
テクノロジー

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

Like token Tip token
270.93 ALIS
Eye catch
テクノロジー

iOS15 配信開始!!

Like token Tip token
7.20 ALIS
Eye catch
クリプト

17万円のPCでTwitterやってるのはもったいないのでETHマイニングを始めた話

Like token Tip token
46.60 ALIS
Eye catch
テクノロジー

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

Like token Tip token
32.10 ALIS
Eye catch
ゲーム

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

Like token Tip token
30.10 ALIS
Eye catch
クリプト

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

Like token Tip token
121.79 ALIS
Eye catch
他カテゴリ

ALISのシステム概観

Like token Tip token
5.00 ALIS
Eye catch
クリプト

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

Like token Tip token
947.13 ALIS
Eye catch
クリプト

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

Like token Tip token
61.20 ALIS
Eye catch
他カテゴリ

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

Like token Tip token
124.82 ALIS
Eye catch
テクノロジー

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

Like token Tip token
85.05 ALIS
Eye catch
クリプト

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

Like token Tip token
38.31 ALIS