Turkey
Turkey

Reputation: 415

How to define a class that is exactly the same as another class in Dart/Flutter

I'm defining some custom Exceptions in Dart.

I want in my logic to check the type of exception and base my processing on that, so I want to create distinct classes for each, for example like this :

class FailedToLoadCriticalDataException implements Exception { }  // app cannot continue
class FailedToLoadNonCriticalDataException implements Exception { } // app can continue

However I also want to pass 2 parameters when I create these types of exceptions, the type of API call, and the API url, and the definition for that would look like this :

class UrlCallFailedException implements Exception {
    
    String _dataTypeName;
    String _urlEndpoint;
  
    UrlCallFailedException([this._dataTypeName, this._urlEndpoint]);
  
    @override
    String toString() {
      return "(${this.runtimeType.toString()}) Failed to fetch $_dataTypeName ($_urlEndpoint)";
    }
}

Now what I want to do is (replace the initial definitions I made earlier and re)define my FailedToLoadCriticalDataException and FailedToLoadNonCriticalDataException classes so that they are exactly the code that is in the UrlCallFailedException class.

Is there any way to simply say something like class FailedToLoadCriticalDataException **is** UrlCallFailedException; and not need to duplicate the code that defines UrlCallFailedException ?

class FailedToLoadCriticalDataException implements UrlCallFailedException{ } is wrong because it is "Missing concrete implementations of 'getter UrlCallFailedException._dataTypeName',.."

class FailedToLoadCriticalDataException extends UrlCallFailedException{ } is wrong because when I got to throw FailedToLoadNonCriticalDataException("Foo", url); it's expectation is that there are no params ("Too many positional arguments: 0 expected, but 2 found.").

Is there a way to create multiple classes that behave exactly the same as another type and differ only in their class, without duplicating all the code ?

Upvotes: 0

Views: 545

Answers (1)

Turkey
Turkey

Reputation: 415

I've come up with this as a decent compromise :

class FailedToLoadCriticalDataException extends UrlCallFailedException { 
  FailedToLoadCriticalDataException([dataTypeName, urlEndpoint]) {
    super._dataTypeName = dataTypeName;
    super._urlEndpoint = urlEndpoint;
  }
}  
class FailedToLoadNonCriticalDataException extends UrlCallFailedException { 
  FailedToLoadNonCriticalDataException([dataTypeName, urlEndpoint]) {
    super._dataTypeName = dataTypeName;
    super._urlEndpoint = urlEndpoint;
  }
} 

Some, but minimal, code duplication, and I can now call throw FailedToLoadNonCriticalDataException("Foo", url); in my code later.

Upvotes: 1

Related Questions