2013-01-04 34 views
5

Tôi có giao diện TypeScript. Vấn đề là nó có khoảng 40 thành viên. Khi tôi sử dụng nó và tôi thực hiện chỉ các thành viên được chọn, tôi nhận được một lỗi rằng có một số thiếu. Làm thế nào để bỏ qua nó? Tôi có phải thực hiện tất cả chúng không? Sự cố này ngăn tôi truyền một loại sang loại khác.Triển khai tất cả thành viên giao diện

Ví dụ:

interface A { 
    // 40 members 
} 

class B implements A { 
    // only 5 members implemented 
} 

// somewhere in the code 
var myVar1: A = something; 
var myVar2: B = <B> myVar1; // here an error (can't convert because B has missing some properties and methods:/) 
+1

Quy tắc cho giao diện bằng tất cả ngôn ngữ tôi đã gặp phải là bạn phải triển khai tất cả các phương pháp của nó. –

Trả lời

10

trong nguyên cảo bạn có thể đánh dấu các mục như tùy chọn:

interface Person { 
    name: string; 
    address?: string; 
} 

tên là bắt buộc và địa chỉ là tùy chọn để triển khai

+0

+1 - đây là một gợi ý tốt. – Fenton

+1

Bạn phải triển khai toàn bộ giao diện nhưng bạn có thể thực hiện một số tùy chọn, như được hiển thị ở đây. Tuy nhiên, nếu bạn thực sự muốn tất cả một số được triển khai đôi khi nhưng sau đó vào các thời điểm khác bạn muốn một tập hợp khác, bạn có thể tạo một cái gì đó như @SteveFenton hiển thị bên dưới –

5

Nếu bạn hứa rằng bạn triển khai giao diện, bạn phải triển khai tất cả.

Một giải pháp sẽ được để có một lớp cơ sở mà thực hiện trong 40 thuộc tính nếu bạn chỉ muốn để đối phó với 5 đặc tính trong B.

interface A { 
    propA: string; 
    propB: string; 
} 

class C implements A { 
    public propA = ""; 
    public propB = ""; 
} 

class B extends C { 
    public propB = "Example"; 
} 

var myVar1: A; 
var myVar2: B = <B> myVar1; 
4

40 mục trong một giao diện khá nhiều.

Ngoài ra, nếu bạn chỉ cần 5 cho một lớp nhất định, nó chỉ ra một vấn đề thiết kế.

Thiết kế thay thế là có nhiều giao diện liên quan và chia các thuộc tính thành nhiều nhóm hợp lý hơn.

interface ICar ... 
interface IRacingCar : ICar 
interface IFlyingCar : ICar 
interface IFamilyCar : ICar 

Sau đó, bạn có thể có lớp thực sự triển khai nhiều giao diện.

class RaceCar: IRacingCar ... 
class FlyingRaceCar: IRaceCar, IFlyingCar ... 
class FlyingFamilyCar: IFlyingCar, IFamilyCar ... 

Ngoài ra, bạn nên tránh truyền từ giao diện đến một lớp cụ thể trừ khi bạn chắc chắn đối tượng thực sự là lớp học đó. Vấn đề sẽ xảy ra nếu bạn cố gắng sử dụng một phương thức của lớp đó không thực sự tồn tại nếu đối tượng không thực sự là kiểu đó.

Các vấn đề liên quan