多态(一)

/**
 * 作者:kuma
 * 版本:v1.0
 * */
public class study_8_1
{
    public static void main(String[] args)
    {
        //多态:可以理解为事物存在的多种体现形态
        //人:男人,女人
        //动物:猫,狗
        //一个小猫咪可以叫做动物,也可以叫猫
        //猫 x=new 猫();
        //动物 x=new 猫();

        /*
        * 1.多态的体现
        *   父类的引用指向了自己的子类对象
        *   animal c=new cat();
        *   父类的引用也可以接受自己的子类对象
        *
        * 2.多态的前提
        *   必须是类与类之间有关系,要么继承,要么实现。
        *   通常还有一个前提,几个子类中的功能对父类存在覆盖
        * 3.多态的好处
        *   多态的出现大大的提高了程序的扩展性
        * 4.多态的弊端
        *   提高了扩展性,但是只能使用父类的引用访问父类中的成员
        * 5.多态的应用
        * 6.多态的出现代码中的特点
        * */

        /*cat c=new cat();
        c.eat();
        dog d=new dog();
        d.eat();*/

        animal c=new cat();//类型提升,和byte,int相加一个意思
        //向上转型,猫转换成动物
        //创建的不是抽象类,抽象类定义变量,创建的是子类对象

        c.eat();

        //如果想要调用猫的特有方法时,如何操作?(调用上一只定义的旧小猫)
        //强制将弗雷德引用转换成子类类型;
        cat b=(cat)c;//转换类型,将动物转换成猫,其实转换的是父类的引用
        b.catch_mouse();

        //千万不要出现这样的操作,就是将父类对象转换成子类对象
        //多态自始至终都是子类对象在做着变化

        function(new pig());

        //毕姥爷 x=new 毕老师();
        //x.讲课();
        //这跑起来肯定是毕老师讲的java
        //但是其他人看的是毕姥爷

        //毕老师假装毕姥爷讲课回来了,有人找看电影
        //毕老师 y=(毕老师)x;//毕老师把胡子摘了,卸掉伪装
        //y.看电影();

        //*-------多态从始至终都是子类的变化------


        function(new dog());

    }
    public static void function(animal a)//animal a=new cat()
    {
        a.eat();
        if(a instanceof cat)//如果a是cat类型
        {
            cat c=(cat)a;
            c.catch_mouse();
        }
        else if(a instanceof dog)
        {
            dog c=(dog)a;
            c.kanJia();
        }
    }
}



/*
 * 需求:
 * 动物:猫,狗
 * */
abstract class animal
{
    abstract void eat();
}

class cat extends animal
{
    public void eat()
    {
        System.out.println("吃鱼");
    }

    public void catch_mouse()
    {
        System.out.println("抓老鼠");
    }
}

class dog extends animal
{
    public void eat()
    {
        System.out.println("吃骨头");
    }

    public void kanJia()
    {
        System.out.println("看家");
    }
}

class pig extends animal
{
    public void eat()
    {
        System.out.println("饲料");
    }

    public void gongdi()
    {
        System.out.println("拱地");
    }
}


在 Django ORM 中实现多态一对多关系,可以使用 Django ContentTypes 库。该库允许您为任何模型创建一个通用的外键字段,该字段可以引用另一个模型的实例,而无需直接指定模型。 具体实现步骤如下: 1. 首先,安装 Django ContentTypes 库:`pip install django-contenttypes` 2. 在 models.py 中定义多态模型: ```python from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.db import models class ParentModel(models.Model): name = models.CharField(max_length=50) class ChildModel1(models.Model): parent = models.ForeignKey(ParentModel, on_delete=models.CASCADE) # 定义通用外键 content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') class ChildModel2(models.Model): parent = models.ForeignKey(ParentModel, on_delete=models.CASCADE) # 定义通用外键 content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') ``` 3. 在视图函数中,可以根据需求获取多态模型的实例: ```python from django.contrib.contenttypes.models import ContentType # 获取 ParentModel 的所有子模型 child_models = [ChildModel1, ChildModel2] # 获取 ParentModel 的实例 parent = ParentModel.objects.get(id=1) # 获取 ParentModel 的所有子模型实例 child_instances = [] for child_model in child_models: content_type = ContentType.objects.get_for_model(child_model) child_instances += child_model.objects.filter(content_type=content_type, object_id=parent.id) # 对子模型实例进行操作 for child_instance in child_instances: # ... ``` 以上就是在 Django ORM 中实现多态一对多关系的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值