// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

class Target {
  const Target(this.stringValue, this.intValue, this.targetValue);

  final String stringValue;
  final int intValue;
  final Target? targetValue;

  void hit() {
    print('$stringValue $intValue');
  }
}

class ExtendsTarget extends Target {
  const ExtendsTarget(String stringValue, int intValue, Target? targetValue)
      : super(stringValue, intValue, targetValue);
}

class ImplementsTarget implements Target {
  const ImplementsTarget(this.stringValue, this.intValue, this.targetValue);

  @override
  final String stringValue;
  @override
  final int intValue;
  @override
  final Target? targetValue;

  @override
  void hit() {
    print('ImplementsTarget - $stringValue $intValue');
  }
}

mixin MixableTarget {
  String get val;

  void hit() {
    print(val);
  }
}

class MixedInTarget with MixableTarget {
  const MixedInTarget(this.val);

  @override
  final String val;
}
