Hướng dẫn javascript override private function - javascript ghi đè chức năng riêng tư
Tôi sẽ giải thích vấn đề tôi đang giải quyết với một ví dụ. Show
Tôi thường định nghĩa các thư viện của riêng mình theo JS theo cách này:
Bây giờ tôi muốn thực hiện một phương thức có thể ghi đè như một cuộc gọi lại từ một sự kiện nhấp chuột. Tôi sẽ làm điều này:
Sau đó, trong thư viện, tôi khai báo cuộc gọi lại "mymethod" gọi một phương thức "có thể vượt quá" khác mà tôi muốn sử dụng trên toàn cầu ", bên ngoài thư viện":
Đây là vấn đề. Nếu tôi xác định lại phương thức "có thể vượt qua" như thế này:
Sau đó, cuộc gọi lại của các sự kiện nhấp chuột tiếp tục bắn "Public.Override" ban đầu xuất ra "ghi đè này!" thông báo thay vì giá trị của tham số. Làm thế nào tôi có thể ghi đè phương thức công khai để xác định lại cuộc gọi lại bên ngoài thư viện ?? Cảm ơn trước. Lưu ý: & nbsp; Trong một lớp con, bạn có thể quá tải các phương thức được kế thừa từ siêu lớp. Các phương thức quá tải như vậy không ẩn cũng không ghi đè các phương thức thể hiện siêu lớp, chúng là các phương thức mới, duy nhất cho lớp con.Phương pháp thể hiện Một phương thức thể hiện trong một lớp con có cùng chữ ký (tên, cộng với số và loại tham số của nó) và loại trả về dưới dạng phương thức thể hiện trong siêu lớp ghi đè lên phương thức của siêu lớp. Khả năng của một lớp con để ghi đè một phương thức cho phép một lớp kế thừa từ một siêu lớp có hành vi "đủ gần" và sau đó sửa đổi hành vi khi cần thiết. Phương thức ghi đè có cùng tên, số và loại tham số và loại trả về dưới dạng phương thức mà nó ghi đè. Một phương thức ghi đè cũng có thể trả về một kiểu con của loại được trả về bởi phương thức ghi đè. Loại phụ này được gọi là loại trả lại hiệp phương sai. Khi ghi đè một phương thức, bạn có thể muốn sử dụng chú thích //... public.overridable = function(param){console.log("Override this!");}; public.myMethod = function(){ if(private.condition) // Just to put some logic public.overridable(private.value); }; //... 1 hướng dẫn trình biên dịch mà bạn dự định ghi đè một phương thức trong siêu lớp. Nếu, vì một số lý do, trình biên dịch phát hiện rằng phương thức không tồn tại ở một trong các siêu lớp, thì nó sẽ tạo ra một lỗi. Để biết thêm thông tin về //... public.overridable = function(param){console.log("Override this!");}; public.myMethod = function(){ if(private.condition) // Just to put some logic public.overridable(private.value); }; //... 1, xem //... public.overridable = function(param){console.log("Override this!");}; public.myMethod = function(){ if(private.condition) // Just to put some logic public.overridable(private.value); }; //... 3.Phương pháp tĩnh Nếu một lớp con định nghĩa một phương thức tĩnh có cùng chữ ký như một phương thức tĩnh trong siêu lớp, thì phương thức trong lớp con ẩn một trong siêu lớp.
Phiên bản của phương pháp tĩnh ẩn được gọi phụ thuộc vào việc nó được gọi từ siêu lớp hay lớp con. public class Animal { public static void testClassMethod() { System.out.println("The static method in Animal"); } public void testInstanceMethod() { System.out.println("The instance method in Animal"); } } Lớp thứ hai, một lớp con của 4, được gọi là 6:public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } } Lớp 6 ghi đè phương thức thể hiện trong 4 và ẩn phương thức tĩnh trong 4. Phương pháp 0 trong lớp này tạo ra một thể hiện là 6 và gọi 2 trên lớp và 3 trên ví dụ.Đầu ra từ chương trình này như sau: The static method in Animal The instance method in Cat Như đã hứa, phiên bản của phương thức tĩnh ẩn được gọi là phiên bản trong siêu lớp và phiên bản của phương thức thể hiện được ghi đè được gọi là phiên bản trong lớp con. Phương pháp giao diệnCác phương thức mặc định và các phương thức trừu tượng trong các giao diện được kế thừa như các phương thức thể hiện. Tuy nhiên, khi các supertypes của một lớp hoặc giao diện cung cấp nhiều phương thức mặc định có cùng chữ ký, trình biên dịch Java tuân theo các quy tắc kế thừa để giải quyết xung đột tên. Các quy tắc này được thúc đẩy bởi hai nguyên tắc sau:
Nếu hai hoặc nhiều phương thức mặc định được xác định độc lập xung đột hoặc phương thức mặc định xung đột với một phương thức trừu tượng, thì trình biên dịch Java sẽ tạo ra lỗi trình biên dịch. Bạn phải ghi đè rõ ràng các phương thức SuperType. Hãy xem xét ví dụ về những chiếc xe điều khiển bằng máy tính mà bây giờ có thể bay. Bạn có hai giao diện ( 8 và 9) cung cấp các triển khai mặc định cho cùng một phương thức, (public class Animal { public static void testClassMethod() { System.out.println("The static method in Animal"); } public void testInstanceMethod() { System.out.println("The instance method in Animal"); } }0): 5 6Một lớp thực hiện cả 8 và 9 phải ghi đè phương thức public class Animal { public static void testClassMethod() { System.out.println("The static method in Animal"); } public void testInstanceMethod() { System.out.println("The instance method in Animal"); } }0. Bạn có thể gọi bất kỳ triển khai mặc định nào với từ khóa public class Animal { public static void testClassMethod() { System.out.println("The static method in Animal"); } public void testInstanceMethod() { System.out.println("The instance method in Animal"); } }4. 7Tên trước public class Animal { public static void testClassMethod() { System.out.println("The static method in Animal"); } public void testInstanceMethod() { System.out.println("The instance method in Animal"); } }4 (trong ví dụ này, 9 hoặc 8) phải tham khảo một siêu âm trực tiếp xác định hoặc kế thừa một mặc định cho phương thức được gọi. Hình thức gọi phương thức này không bị giới hạn trong việc phân biệt giữa nhiều giao diện được triển khai có chứa các phương thức mặc định có cùng chữ ký. Bạn có thể sử dụng từ khóa public class Animal { public static void testClassMethod() { System.out.println("The static method in Animal"); } public void testInstanceMethod() { System.out.println("The instance method in Animal"); } }4 để gọi một phương thức mặc định trong cả hai lớp và giao diện. Các phương thức thể hiện kế thừa từ các lớp có thể ghi đè các phương thức giao diện trừu tượng. Xem xét các giao diện và lớp sau: 8 9 0Phương thức public class Animal { public static void testClassMethod() { System.out.println("The static method in Animal"); } public void testInstanceMethod() { System.out.println("The instance method in Animal"); } }9 trả về chuỗi 5 Lớp public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }1 kế thừa phương thức public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }2 từ lớp public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }3, ghi đè phương thức trừu tượng của cùng tên trong giao diện public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; Animal.testClassMethod(); myAnimal.testInstanceMethod(); } }4. Lưu ý: Các phương thức tĩnh trong giao diện không bao giờ được kế thừa.: Static methods in interfaces are never inherited. Sửa đổiTrình xác định truy cập cho một phương thức ghi đè có thể cho phép nhiều hơn, nhưng không ít, truy cập hơn phương thức ghi đè. Ví dụ, một phương thức thể hiện được bảo vệ trong siêu lớp có thể được công khai, nhưng không phải là riêng tư, trong lớp con. Bạn sẽ gặp lỗi thời gian biên dịch nếu bạn cố gắng thay đổi phương thức thể hiện trong siêu lớp thành phương thức tĩnh trong lớp con và ngược lại. Bản tóm tắtBảng sau đây tóm tắt những gì xảy ra khi bạn xác định một phương thức có cùng chữ ký như một phương thức trong một siêu lớp. summarizes what happens when you define a method with the same signature as a method in a superclass. Xác định một phương thức có cùng chữ ký như phương thức của siêu lớp
Che giấu In a subclass, you can overload the methods inherited from the superclass. Such overloaded methods neither hide nor override the superclass instance methods—they are new methods, unique to the subclass. |