最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

FlutterDart- DAO interfaces- can't overload method parameters - Stack Overflow

programmeradmin0浏览0评论

Wanted to create an interface for DAOs that can be "overloaded" with different method params types:

abstract class DaoInterface {
  Future<List<Object?>> findAll();
  Future<Object?> findOne(int id);
  Future<Object?> insert<T>(T value);
  Future<Object?> update(Object dto);
  Future<Object?> deleteOne(Object dto);
  Future<Object?> deleteAll();
}

// impl
class CategoryDAO implements DaoInterface {
@override
Future<CategoryEntity?> deleteAll() {
  // TODO: implement deleteAll
  throw UnimplementedError();
}

@override
Future<CategoryEntity?> deleteOne(CategoryEntity category) {
  // TODO: implement deleteOne
  throw UnimplementedError();
}

@override
Future<List<CategoryEntity?>> findAll() {
  // TODO: implement findAll
  throw UnimplementedError();
}

@override
Future<CategoryEntity?> findOne(int id) {
  // TODO: implement findOne
  throw UnimplementedError();
}

@override
Future<CategoryEntity?> update(CategoryEntity category) {
  // TODO: implement update
  throw UnimplementedError();
}

@override
Future<CategoryEntity?> insert(CategoryEntity entity) {
  // TODO: implement insert
  throw UnimplementedError();
}

}

the above throws warnings for insert, update, deleteOne methods, ie:

'CategoryDAO. insert' ('Future<CategoryEntity?> Function(CategoryEntity)') isn't a valid override of 'DaoInterface. insert' ('Future<Object?> Function(T)'). (Documentation) The member being overridden (dao_interface. dart:9).

I've tried using Object base class, generics, etc- and nothign seems to allow this behavior. I expected to implement this interface for other DAOs that take different entity classes to reduce code duplication (PersonDAO using PersonEntity, etc). Thoughts? Am I approaching this incorrectly?

Wanted to create an interface for DAOs that can be "overloaded" with different method params types:

abstract class DaoInterface {
  Future<List<Object?>> findAll();
  Future<Object?> findOne(int id);
  Future<Object?> insert<T>(T value);
  Future<Object?> update(Object dto);
  Future<Object?> deleteOne(Object dto);
  Future<Object?> deleteAll();
}

// impl
class CategoryDAO implements DaoInterface {
@override
Future<CategoryEntity?> deleteAll() {
  // TODO: implement deleteAll
  throw UnimplementedError();
}

@override
Future<CategoryEntity?> deleteOne(CategoryEntity category) {
  // TODO: implement deleteOne
  throw UnimplementedError();
}

@override
Future<List<CategoryEntity?>> findAll() {
  // TODO: implement findAll
  throw UnimplementedError();
}

@override
Future<CategoryEntity?> findOne(int id) {
  // TODO: implement findOne
  throw UnimplementedError();
}

@override
Future<CategoryEntity?> update(CategoryEntity category) {
  // TODO: implement update
  throw UnimplementedError();
}

@override
Future<CategoryEntity?> insert(CategoryEntity entity) {
  // TODO: implement insert
  throw UnimplementedError();
}

}

the above throws warnings for insert, update, deleteOne methods, ie:

'CategoryDAO. insert' ('Future<CategoryEntity?> Function(CategoryEntity)') isn't a valid override of 'DaoInterface. insert' ('Future<Object?> Function(T)'). (Documentation) The member being overridden (dao_interface. dart:9).

I've tried using Object base class, generics, etc- and nothign seems to allow this behavior. I expected to implement this interface for other DAOs that take different entity classes to reduce code duplication (PersonDAO using PersonEntity, etc). Thoughts? Am I approaching this incorrectly?

Share Improve this question asked Feb 6 at 12:44 ThawedBuffaloThawedBuffalo 111 bronze badge New contributor ThawedBuffalo is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
Add a comment  | 

1 Answer 1

Reset to default 1

The Dart analyzer displays an error message because:

The parameter of an overridden method must have either the same type or a supertype of the corresponding parameter in the superclass.

For more info see use-sound-parameter-types-when-overriding-methods.

If there is good reason to use a subtype as a function parameter you can do that by using the keyword covariant:

@override
Future<CategoryEntity?> insert(covariant CategoryEntity entity) {
  // TODO: implement insert
  throw UnimplementedError();
}

Another option would be to change DaoInterface to:

// Note: DaoInterface is now a generic class. 
abstract class DaoInterface<T extends Object> {
  Future<List<T?>> findAll();
  Future<T?> findOne(int id);
  Future<T?> insert(T value);
  Future<T?> update(T dto);
  Future<T?> deleteOne(T dto);
  Future<T?> deleteAll();
}

class CategoryEntity {}

// Note: Uses CategoryEntity as type parameter of DaoInterface. 
class CategoryDAO implements DaoInterface<CategoryEntity> {
  @override
  Future<CategoryEntity?> deleteAll() {
    // TODO: implement deleteAll
    throw UnimplementedError();
  }

  @override
  Future<CategoryEntity?> deleteOne(CategoryEntity category) {
    // TODO: implement deleteOne
    throw UnimplementedError();
  }

  @override
  Future<List<CategoryEntity?>> findAll() {
    // TODO: implement findAll
    throw UnimplementedError();
  }

  @override
  Future<CategoryEntity?> findOne(int id) {
    // TODO: implement findOne
    throw UnimplementedError();
  }

  @override
  Future<CategoryEntity?> update(CategoryEntity category) {
    // TODO: implement update
    throw UnimplementedError();
  }

  @override
  Future<CategoryEntity?> insert(CategoryEntity entity) {
    // TODO: implement insert
    throw UnimplementedError();
  }
}

发布评论

评论列表(0)

  1. 暂无评论