我有这堂课:
public class MyThread {
public static void main(String[] args) {
Thread thread = new Thread() {
public void run() {
System.out.print("Test from Anonymous Class!");
}
};
Thread newThread = new Thread(thread);
newThread.run();
}
}
当我运行此程序时,我得到Test from Anonymous Class!
。
现在,我试图用另一个类来模拟这种行为:
interface MyInterface {
public void doTest();
}
class MyClass implements MyInterface {
public MyClass() {}
public MyClass(MyInterface myInterface) {}
public void doTest() {
System.out.println("Test from MyClass!");
}
}
public class Test {
public static void main(String[] args) {
MyClass myClass1 = new MyClass() {
public void doTest() {
System.out.println("Test from Anonymous Class!");
}
};
MyClass myClass2 = new MyClass(myClass1);
myClass2.doTest();
}
}
当我运行此程序时,我得到Test from MyClass!
。为什么在第一个例子中打印出Test from Anonymous Class!
?如何使用MyClass
类获得相同的行为?
提前致谢!
答案 0 :(得分:2)
那是因为你对你的参数做了什么事myClass1
public MyClass(MyInterface myInterface) {}
你得到参数,那又怎样?如果要执行参数所做的操作,则必须调用方法:
myClass1.doTest()
>"Test from Anonymous Class!"
您正在做的事情很少见,但如果您从正确的对象调用该方法,您将得到您想要的内容:)
另一种罕见但有效的方法是拥有一个实例变量,并将其命名为:
class MyClass implements MyInterface {
MyClass myOtherClass;
public MyClass() {}
public MyClass(MyInterface myInterface) {
this.myOtherClass = myInterface;
}
public void doTest() {
System.out.println("Test from MyClass!");
}
}
然后,你调用其中的方法:
public class Test {
public static void main(String[] args) {
MyClass myClass1 = new MyClass() {
public void doTest() {
System.out.println("Test from Anonymous Class!");
}
};
MyClass myClass2 = new MyClass(myClass1);
myClass2.myOtherClass.doTest(); // calling method from myClass1
}
}
答案 1 :(得分:2)
您需要初始化目标,因此它会调用您班级中的方法
class MyClass implements MyInterface {
MyInterface myInterface;
public MyClass() {}
public MyClass(MyInterface myInterface) {
this.myInterface=myInterface;
}
public void doTest() {
if(myInterface !=null){
myInterface.doTest();
return;
}
System.out.println("Test from MyClass!");
}
}
答案 2 :(得分:2)
似乎你想从一个类中实现一个委托,该类将构造函数的参数作为接口。
当您调用func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
var bId = Helper.businessId as String
let param = ["id" : bId] as! [String : AnyObject]
if editingStyle == .delete{
print(Helper.memId)
print("Deleted")
var myDictionary = self.List[indexPath.row] as! NSDictionary
var bId : String!
if myDictionary.allKeys.count>0
{
bId = myDictionary["id"] as! String
}
var bb = bId as String
if editingStyle == .delete{
print(Helper.memId)
print("Deleted")
Alamofire.request("http://api.noattabeta.com/api/v1/user/current/memberships/\(bb)", method: .delete, headers: ["Authorization":Helper.token]).responseString
{response in
print("In Response")
switch response.result {
case .success:
DispatchQueue.main.async {
let myAlert = UIAlertController(title:"Alert", message: "Do You want to delete",preferredStyle:UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title:"Ok",style:UIAlertActionStyle.default,handler:{ (action: UIAlertAction!) in
self.tableView.reloadData()
})
myAlert.addAction(okAction)
let cancelAction = UIAlertAction(title:"Cancel",style:UIAlertActionStyle.default,handler:{ (action: UIAlertAction!) in
self.tableView.reloadData()
})
myAlert.addAction(okAction)
myAlert.addAction(cancelAction)
self.present(myAlert, animated: true, completion: nil)
}
case .failure(let error):
print(error)
}}}
而您的自定义类未模仿此行为时,Thread
构造函数使用作为参数提供的Runnable
实例作为执行目标。你确实对传递的Thread#start()
参数没有做任何事情:
MyInterface
要实施委派,您应在public MyClass(MyInterface myInterface) {}
中添加MyInterface
字段,并在构造函数中对其进行评估。
然后在MyClass
方法中使用它。
doTest()
答案 3 :(得分:1)
答案很简单。 Thread中的run()方法被覆盖,它将始终是要运行的方法。
在第二个例子中,myClass2使用它实例doTest()方法,并且从不使用myClass1,除了在constuctor中。