Class
類是面向?qū)ο蟮幕A(chǔ),讓我從了解類開始深入Dart語言的世界。本文將從下面幾個(gè)方面介紹:
- 類的定義
- 抽象類(接口)
Dart語言的定義
Dart是一種單繼承,基于類,面向?qū)ο蟮恼Z言。它在類和接口機(jī)制方面與Java和C#有許多相似之處。下面是個(gè)類的Demo:
class User {
String _forename;
String get forename => _forename;
set forename(value) => _forename = value;
String surname;
String getFullName(){
return "$forename $surname";
}
}
main(){
User user = new User();
user.forename = "Alice";
user.surname = "Smith";
String fullName= user.getFullName();
print(fullName);
}
dartpad 運(yùn)行效果
Alice Smith
demo注釋版
class User { //類名稱
String _forename; //私有屬性
String get forename => _forename; // 公開getter方法,可以訪問私有屬性
set forename(value) => _forename = value;// 公開setter方法
String surname; //公有屬性
String getFullName() //返回forename和surname 字符串的公有函數(shù)
{
return "$forename $surname"; //Dart字符串格式化方式
}
}
main(){
User user = new User();//創(chuàng)建對(duì)象
user.forename = "Alice";//給對(duì)象forname屬性賦值
user.surname = "Smith";// 給對(duì)象surname屬性賦值
String fullName= user.getFullName();//調(diào)用對(duì)象方法
print(fullName); // 輸出
}
Dart 類的繼承
Dart是一種單繼承的面向?qū)ο笳Z言,下面是繼承的demo
class User {//類名稱
String _forename; //私有屬性
String get forename => _forename; // 公開getter方法,可以訪問私有屬性
set forename(value) => _forename = value; // 公開setter方法
String surname; //公有屬性
String getFullName() //返回forename和surname 字符串的公有函數(shù)
{
return "$forename $surname"; //Dart字符串格式化方式
}
bool isLogin;//是否登錄 true or false
}
class AuthService {
User auth(String username, String password) {
return null;
}
}
class MockAuthService extends AuthService {
User auth(String username, String password) {
var user = new User();
user.forename = 'testForename';
user.surname = 'testSurname';
user.isLogin=false;
return user;
}
}
class YourAuthService extends AuthService {
User auth(String username, String password) {
var user = new User();
user.forename = 'Alice';
user.surname = 'password';
user.isLogin=true;
return user;
}
}
User doLogon(AuthService authSvc, String username, String password) {
User user = authSvc.auth(username, password);
print("User is authenticated:${user.isLogin}");
return user;
}
main() {
AuthService authService = new MockAuthService();
var user = doLogon(authService, 'Alice', 'password');
print(user.forename);
print(user.surname);
authService = new YourAuthService();
user = doLogon(authService, 'Alice', 'password');
print(user.forename);
print(user.surname);
}
運(yùn)行效果
User is authenticated:false
testForename
testSurname
User is authenticated:true
Alice
password
Dart 抽象類
從上面的demo中我們可以發(fā)現(xiàn),AuthService其實(shí)并沒有實(shí)際的代碼,因此我們可以通過abstract class 來進(jìn)行定義。
具體代碼如下:
class User {//類名稱
String _forename; //私有屬性
String get forename => _forename; // 公開getter方法,可以訪問私有屬性
set forename(value) => _forename = value; // 公開setter方法
String surname; //公有屬性
String getFullName() //返回forename和surname 字符串的公有函數(shù)
{
return "$forename $surname"; //Dart字符串格式化方式
}
bool isLogin;//是否登錄 true or false
}
abstract class AuthService {
User auth(String username, String password) ;
}
class MockAuthService implements AuthService {
User auth(String username, String password) {
var user = new User();
user.forename = 'testForename';
user.surname = 'testSurname';
user.isLogin=false;
return user;
}
}
class YourAuthService implements AuthService {
User auth(String username, String password) {
var user = new User();
user.forename = 'Alice';
user.surname = 'password';
user.isLogin=true;
return user;
}
}
User doLogon(AuthService authSvc, String username, String password) {
User user = authSvc.auth(username, password);
print("User is authenticated:${user.isLogin}");
return user;
}
main() {
AuthService authService = new MockAuthService();
var user = doLogon(authService, 'Alice', 'password');
print(user.forename);
print(user.surname);
authService = new YourAuthService();
user = doLogon(authService, 'Alice', 'password');
print(user.forename);
print(user.surname);
}
abstract 關(guān)鍵詞告知Dart這個(gè)類方法沒有被實(shí)現(xiàn)。具體抽象類的使用思路大家可以參考任何一本設(shè)計(jì)模式的書籍。