当前位置: 首页 > 知识库问答 >
问题:

Java和Kotlin中委托关系的比较

景嘉志
2023-03-14

我试图理解继承与委派的斗争,以及如何实现这两者。我的问题是为什么我要用Kotlin的方式用by关键字实现委派?我觉得太过分了。

让我给你举个例子。我们有一个可以点餐的应用程序。这款应用名为DeliveryQueen。

下面是Java示例:

public interface FoodDeliverable {
    void deliverSomeFood();
}

public class PizzaCastle implements FoodDeliverable {
    @Override
    public void deliverSomeFood() {
        System.out.println("deliver the tastiest pizza in the world");
    }
}

public class BurgerCastle implements FoodDeliverable {
    @Override
    public void deliverSomeFood() {
        System.out.println("deliver the tastiest burger in the world");
    }
}

public class DeliveryQueen {
    private FoodDeliverable orderedFood;

    void chooseFood(FoodDeliverable food) {
        this.orderedFood = food;
    }

    void orderSomeFood() {
        this.orderedFood.deliverSomeFood();
    }
}

public class Main {

    public static void main(String[] args) {
        System.out.println("Hello and welcome ");

        DeliveryQueen dq = new DeliveryQueen();

        dq.chooseFood(new BurgerCastle());
        dq.orderSomeFood();
    }
}

Kotlin示例#1没有明确使用by关键字:

interface FoodDeliverable {
    fun deliverSomeFood()
}

class PizzaCastle: FoodDeliverable {
    override fun deliverSomeFood() {
        print("deliver the tastiest pizza in the world")
    }
}

class BurgerCastle: FoodDeliverable {
    override fun deliverSomeFood() {
        print("deliver the tastiest burger in the world")
    }
}

class DeliveryQueen {
    private var orderedFood: FoodDeliverable = PizzaCastle()

    fun chooseFood(food: FoodDeliverable) {
        orderedFood = food
    }

    fun orderSomeFood() {
        orderedFood.deliverSomeFood()
    }
}

fun main() {
    println("Hello")

    val dq = DeliveryQueen()
    dq.chooseFood(BurgerCastle())
    dq.orderSomeFood()
}
interface FoodDeliverable {
    fun deliverSomeFood()
}

class PizzaCastle: FoodDeliverable {
    override fun deliverSomeFood() {
        print("deliver the tastiest pizza in the world")
    }
}

class BurgerCastle: FoodDeliverable {
    override fun deliverSomeFood() {
        print("deliver the tastiest burger in the world")
    }
}

class DeliveryQueen(var orderedFood: FoodDeliverable): FoodDeliverable by orderedFood {
    //private var orderedFood: FoodDeliverable = PizzaCastle()

    fun chooseFood(food: FoodDeliverable) {
        orderedFood = food
    }

    fun orderSomeFood() {
        orderedFood.deliverSomeFood()
    }
}

fun main() {
    println("Hello")

    val dq = DeliveryQueen(PizzaCastle())
    dq.chooseFood(BurgerCastle())
    dq.orderSomeFood()
}

共有1个答案

法烨华
2023-03-14

在Kotlin示例#1中,DeliveryQueen不是FoodDeliverable,因为它没有实现接口,所以它不是一个正确的组合实现。要修复Kotlin示例#1,您必须实现fooddeliverable,这将迫使您重写它的方法:

class DeliveryQueen: FoodDeliverable  {
    private var orderedFood: FoodDeliverable = PizzaCastle()

    override fun deliverSomeFood() {
        orderedFood.deliverSomeFood()
    }

    fun chooseFood(food: FoodDeliverable) {
        orderedFood = food
    }

    fun orderSomeFood() {
        orderedFood.deliverSomeFood()
    }

}

了解如何实现DeliversomeFood(),尽管它所做的只是将调用传递给委托OrderedFood?这就是Kotlin使用by进行委托的地方,如Kotlin示例#2所示,默认情况下,您获得了实现,并且只在需要添加额外逻辑的地方使用override方法。当您的接口有更多的方法时,好处会更明显,在这种情况下,使用by委派可以为您节省大量样板。

 类似资料:
  • 主要内容:类委托,属性委托,标准委托,可观察属性 Observable,把属性储存在映射中,Not Null,局部委托属性,属性委托要求,翻译规则,提供委托委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口

  • 委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口 Base 所有方法,并且委托一个传入的 Base 类的

  • 本文向大家介绍C#中的委托是什么?事件是不是一种委托?事件和委托的关系。相关面试题,主要包含被问及C#中的委托是什么?事件是不是一种委托?事件和委托的关系。时的应答技巧和注意事项,需要的朋友参考一下 委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的指针。 委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实

  • 如果没有,是否有一种简洁的方法来设置类加载器的上下文(比方说,从特定类/库调用的所有内容都应该使用相同的类加载器)。

  • 问题内容: 我对Java中的委托和回调的术语有些误解。 那又如何实现呢? 问题答案: 这是一个回调。根据维基百科: 在计算机编程中,回调是对一段可执行代码的引用,该可执行代码作为参数传递给其他代码。 因此,让我们看一下可执行代码: 在这里,参数是对type对象的引用。由于该引用作为参数传递,因此它是一个回调。 委托由对象内部完成-与方法的调用方式无关。例如,如果变量不是参数,而是实例变量: …那将