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ụ.

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:

window.myLib = (function () {
  var public = {}; // for storing public methods and values
  var private = {}; // for storing private methods and values

  // Atributes and methods here

  return public; // return the public part to be used globally
})();

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":

  //...
  public.overridable = function(param){console.log("Override this!");};

  public.myMethod = function(){
    if(private.condition) // Just to put some logic
     public.overridable(private.value);
  };
  //...

Đâ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:

  myLib.overridable = function(p){console.log(p)};

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.

  • Sự khác biệt giữa việc ẩn một phương thức tĩnh và ghi đè một phương thức thể hiện có ý nghĩa quan trọng:
  • 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.

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

  //...
  public.overridable = function(param){console.log("Override this!");};

  public.myMethod = function(){
    if(private.condition) // Just to put some logic
     public.overridable(private.value);
  };
  //...
4, được gọi là
  //...
  public.overridable = function(param){console.log("Override this!");};

  public.myMethod = function(){
    if(private.condition) // Just to put some logic
     public.overridable(private.value);
  };
  //...
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

  //...
  public.overridable = function(param){console.log("Override this!");};

  public.myMethod = function(){
    if(private.condition) // Just to put some logic
     public.overridable(private.value);
  };
  //...
6 ghi đè phương thức thể hiện trong
  //...
  public.overridable = function(param){console.log("Override this!");};

  public.myMethod = function(){
    if(private.condition) // Just to put some logic
     public.overridable(private.value);
  };
  //...
4 và ẩn phương thức tĩnh trong
  //...
  public.overridable = function(param){console.log("Override this!");};

  public.myMethod = function(){
    if(private.condition) // Just to put some logic
     public.overridable(private.value);
  };
  //...
4. Phương pháp
  myLib.overridable = function(p){console.log(p)};
0 trong lớp này tạo ra một thể hiện là
  //...
  public.overridable = function(param){console.log("Override this!");};

  public.myMethod = function(){
    if(private.condition) // Just to put some logic
     public.overridable(private.value);
  };
  //...
6 và gọi
  myLib.overridable = function(p){console.log(p)};
2 trên lớp và
  myLib.overridable = function(p){console.log(p)};
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ện

Cá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:

  • Các phương thức thể hiện được ưu tiên hơn các phương thức mặc định giao diện.

    Xem xét các lớp và giao diện sau:

    public class Horse {
        public String identifyMyself() {
            return "I am a horse.";
        }
    }
    public interface Flyer {
        default public String identifyMyself() {
            return "I am able to fly.";
        }
    }
    public interface Mythical {
        default public String identifyMyself() {
            return "I am a mythical creature.";
        }
    }
    
    
    0

    Phương thức

      myLib.overridable = function(p){console.log(p)};
    
    4 trả về chuỗi
      myLib.overridable = function(p){console.log(p)};
    
    5

  • Các phương pháp đã được ghi đè bởi các ứng cử viên khác bị bỏ qua. Hoàn cảnh này có thể phát sinh khi SuperTypes chia sẻ một tổ tiên chung.

    Xem xét các giao diện và lớp sau:

    
    
    1
    
    
    2
    
    
    3
    
    
    4

    Phương thức

      myLib.overridable = function(p){console.log(p)};
    
    6 trả về chuỗi
      myLib.overridable = function(p){console.log(p)};
    
    7

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 (

  myLib.overridable = function(p){console.log(p)};
8 và
  myLib.overridable = function(p){console.log(p)};
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

6

Một lớp thực hiện cả

  myLib.overridable = function(p){console.log(p)};
8 và
  myLib.overridable = function(p){console.log(p)};
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.


7

Tê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,
  myLib.overridable = function(p){console.log(p)};
9 hoặc
  myLib.overridable = function(p){console.log(p)};
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

  //...
  public.overridable = function(param){console.log("Override this!");};

  public.myMethod = function(){
    if(private.condition) // Just to put some logic
     public.overridable(private.value);
  };
  //...
0

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");
    }
}
9 trả về chuỗi
  myLib.overridable = function(p){console.log(p)};
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 đổi

Trì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ắt

Bả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
 Phương thức thể hiện siêu lớpPhương pháp tĩnh siêu lớp
Phương thức thể hiện lớp conGhi đèTạo lỗi thời gian biên dịch
Phương pháp tĩnh phân lớpTạo lỗi thời gian biên dịchPhương pháp tĩnh phân 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.