簡體   English   中英

dart class 層次結構錯誤 - 'a' 不擴展 'b' 嘗試使用是或是子類的類型 'b'

[英]dart class hierarchy error - 'a' doesn't extend 'b' Try using a type that is or is a subclass of 'b'

我有這個代碼:

class GroceryItemRepository extends ARepository<GroceryItemDomainEntity, int> {
  GroceryItemRepository(IHttpDataSource httpDataSource)
      : super(httpDataSource, 'GroceryItems');
}

導致此編譯時錯誤:

'GroceryItemDomainEntity' doesn't extend 'ADomainEntity<GroceryItemDomainEntity, int>'.
Try using a type that is or is a subclass of 'ADomainEntity<GroceryItemDomainEntity, int>'

我不知道為什么GroceryItemDomainEntity不擴展ADomainEntity<GroceryItemDomainEntity, int>

這是 class 層次結構:

abstract class GroceryItemDomainEntity extends AVeganItemDomainEntity
    implements _$GroceryItemDomainEntity {

abstract class AVeganItemDomainEntity
    extends ADomainEntity<AVeganItemDomainEntity, int> {

abstract class ADomainEntity<EntityType, IdType> extends AEntity<EntityType>
    implements IDomainEntity<EntityType, IdType> {

abstract class AEntity<EntityType> implements IEntity<EntityType> {

當我GroceryItemDomainEntity聲明為:

abstract class GroceryItemDomainEntity extends ADomainEntity<GroceryItemDomainEntity, int>

但我需要GroceryItemDomainEntity來包含AVeganItemDomainEntity的成員。 為什么GroceryItemDomain實體不擴展ADomainEntity<GroceryItemDomainEntity, int>

編輯 - 對不起,我錯過了這個 class:

import 'package:vepo/src/common/constants/environment_constants.dart';
import 'package:vepo/src/data/data_sources/remote/i_remote_data_source.dart';
import 'package:vepo/src/domain/common/domain_entity/a_domain_entity.dart';

import 'i_repository.dart';

abstract class ARepository<EntityType extends ADomainEntity<EntityType, IdType>,
    IdType> implements IRepository<EntityType> {
  ARepository(this.httpDataSource, this.$baseUri);

  final IHttpDataSource httpDataSource;
  final String $baseUri;

  @override
  Future<EntityType> $fetch() {
    throw UnimplementedError();
  }

  @override
  Future<EntityType> $save({EntityType entity}) {
    var uri = $baseUri;
    if (entity.id != null) {
      uri = uri + '${entity.id}';
    }
    final Uri theUri = Uri(path: '${EnvironmentConstants.of().apiUrl}/$uri');
    return httpDataSource.post<EntityType>(theUri, body: entity);
  }
}
AVeganItemDomainEntity extends ADomainEntity<AVeganItemDomainEntity, int>
GroceryItemDomainEntity extends AVeganItemDomainEntity

所以GroceryItemDomainEntity擴展ADomainEntity<AVeganItemDomainEntity, int>

GroceryItemRepository extends ARepository<GroceryItemDomainEntity, int>中, EntityTypeGroceryItemDomainEntity

然而

ARepository<EntityType extends ADomainEntity<EntityType, IdType>, IdType>

由於EntityTypeGroceryItemDomainEntityARepository期望GroceryItemDomainEntity擴展ADomainEntity<GroceryItemDomainEntity, int>但它反而擴展ADomainEntity<AVeganItemDomainEntity, int>

AVeganItemDomainEntity是 GroceryItemDomainEntity 的超級GroceryItemDomainEntity 因此, AVeganItemDomainEntity不能用於GroceryItemDomainEntity的地方。 但另一種方法是可能的。

這需要更改EntityTypeARepository中擴展的內容。 我能想到的一個可能的解決方案是使用具體的基本類型,如AEntityADomainEntity

ARepository<EntityType extends ADomainEntity<AEntity, IdType>, IdType>
ARepository<EntityType extends ADomainEntity<ADomainEntity, IdType>, IdType>

要不就

ARepository<EntityType extends ADomainEntity, IdType>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM