Когда твой отец дарит тебе и твоему брату 2 подарка, и оба подарка - это ноутбуки, но они не относятся к разным типам ноутбуков, ты хочешь знать, равны они или нет!Таким образом, вы сравните все аспекты, которые важны для вас RAM, SSD, CPU.
на бумаге: myLaptop: 16G/256G/i5 | myBrotherLaptop: 8G/512G/i5
Предполагая, что ваш мозг использует язык дартс, ивы рассматривали каждый подарок как объект этого класса:
class LaptopGiftClass {
int ram;
int ssd;
String cpu;
// Default constructor
LaptopGiftClass(this.ram, this.ssd, this.cpu);
}
, чтобы сравнить Equailty обоих подарков, созданных с использованием вышеуказанного класса, Dart и другие объектно-ориентированные языки, например Java, C #, ожидают, что вы создадите их.(переопределить) эти функции, чтобы эти языки понимали объекты и могли сравнивать любые два объекта одного и того же класса:
@override
bool operator ==(Object myBrotherLaptop) =>
identical(myLaptop, myBrotherLaptop) ||
myBrotherLaptop is LaptopGiftClass &&
runtimeType == myBrotherLaptop.runtimeType &&
name == myBrotherLaptop.name;
@override
int get hashCode => name.hashCode;
если эти строки вас пугают, никто вас не винит, поэтому приятнолюди создали равноправный пакет для нас!
равноправный пакет говорит вам «оставьте мне эту страшную работу» Но как передать страшный код на равноправный пакет ??!Сделав две вещи:
- Сделайте ваш класс расширяемым:
dart class LaptopGiftClass extends Equatable {...}
- Передайте все свойства, с которыми вы хотите сравнить внутри массива, в Equatable (супер / родительский класс) с первого момента, поэтому внутри конструктора:
LaptopGiftClass(this.ram, this.ssd, this.cpu) : super([RAM, SSD, CPU]);
Ваш последний класс:
class LaptopGiftClass extends Equatable {
int ram;
int ssd;
String cpu;
// Default constructor
LaptopGiftClass(this.ram, this.ssd, this.cpu) : super([RAM, SSD, CPU]);
}
И ВЫ СДЕЛАНЫ!Теперь вы можете проверить равенство двух даров, просто создайте объекты и сравните:
LaptopGiftClass myLaptop = LaptopGiftClass(16,256,'i5');
LaptopGiftClass myBrotherLaptop = LaptopGiftClass(8, 512,'i5');
И ПРОСТО ПЕРЕД НАЧАЛОМ СРАВНЕНИЯ, ваш брат увидел вас, и, поскольку он геймер, он хочет, чтобы вы добавили большесвойства в этом равенстве проверяются: GPU и Screen_Resolution !ваша мама услышала это и попросила вас добавить цену тоже!
Теперь у вас есть список новых реквизитов для сравнения: [GPU, Screen_Resolution, Price].
Итакпоскольку вы следовали принципу чистого кода, вы ожидали этого, и вы позволили конструктору получить больше свойств для сравнения с:
// This only mean combine both lists
[RAM, SSD, CPU]..addAll(myBrotherAndMotherProps)
, поэтому ваш конечный класс:
class LaptopGiftClass extends Equatable {
int ram;
int ssd;
String cpu;
// Default constructor
LaptopGiftClass(
this.ram,
this.ssd,
this.cpu,
// List of list => because they think clean code
// and maybe in the future the will send other data,
// NOT only props..
// one of the sent array is the extra prop that
// I need to compare 'myBrotherAndMotherProps', and
// as sometime brother and mother will not ask you
// to add props to compare, you give it a default value
// as empty "const []", why const here, just for better
// performance as you are so soooo Professional!!
[ List myBrotherAndMotherProps = const [] ],
) : super([RAM, SSD, CPU]..addAll(myBrotherAndMotherProps));
// WHY TO PASS FROM INSIDE THE CONSTRUCTOR?
// because Equatable needs them (required)
// and not at anytime but immediately in the
// constructor of itself, so we made this
// chaining(constructor pass to another constructor)..
}
Итакочевидно, что essintial свойствами являются [RAM, SSD, CPU], но также будет учитываться и все остальное, поскольку мы сделали реализацию чистой, гибкой и масштабируемой.
перед добавлением этого гибкого кода List<Object> get props => [RAM, SSD, CPU]..addAll(myBrotherAndMotherProps);
Раньше это были EQUAL !!:
// Note first 3 are equal [RAM, SSD, CPU]:
LaptopGiftClass myLaptop = LaptopGiftClass(16,256,'i5', 'Nvidia', 1080, '1200$');
LaptopGiftClass myBrotherLaptop = LaptopGiftClass(16, 256,'i5', 'Intel HD', 720, '900$');
myLaptop == myBrotherLaptop; // True without ..addAll(myBrotherAndMotherProps);
myLaptop == myBrotherLaptop; // False with ..addAll(myBrotherAndMotherProps);
То же самое происходит с TimerState:
@immutable
abstract class TimerState extends Equatable {
final int duration;
TimerState(this.duration, [List props = const []])
: super([duration]..addAll(props));
}
TimerState
реализовано так же, как LaptopGiftClass
выше (последняя реализация).Вы можете отправить props
на него с помощью конструктора:
TimerState(this.duration, [List props = const []])
: super([duration]..addAll(props));
, поэтому TimerState
передаст список реквизитов своему родителю (super / Equatable / what extended) в этой строке следующим образом: : super([duration]..addAll(props));
и в этом примере таймера;duration
- это базовая опора, как [RAM, SSD, CPU]
для LaptopGiftClass.
, и иерархия будет такой:
// Inside class Paused extends TimerState {...}
Paused(int duration) : super(duration); // super is TimerState
// then Inside abstract class TimerState extends Equatable {..}
TimerState(this.duration, [List props = const []])
: super([duration]..addAll(props)); // super is Equatable
// Then Equatable will get props and deal with it for you...