小编T-R*_*Rex的帖子

我车库里真的有车吗?

我是Java编程的新手,试图掌握OOP.

所以我构建了这个抽象类:

public abstract class Vehicle{....}
Run Code Online (Sandbox Code Playgroud)

和2个子类:

public class Car extends Vehicle{....}
public class Boat extends Vehicle{....}
Run Code Online (Sandbox Code Playgroud)

Car并且Boat还包含一些不常见的唯一字段和方法(不具有相同的名称,因此我无法在Vehicle中为它们定义抽象方法).

现在在mainClass我设置了我的新车库:

Vehicle[] myGarage= new Vehicle[10];
myGarage[0]=new Car(2,true);
myGarage[1]=new Boat(4,600);
Run Code Online (Sandbox Code Playgroud)

在我尝试访问Car独有的一个字段之前,我对多态性非常满意,例如:

boolean carIsAutomatic = myGarage[0].auto;
Run Code Online (Sandbox Code Playgroud)

编译器不接受.我使用cast来解决这个问题:

boolean carIsAutomatic = ((Car)myGarage[0]).auto;
Run Code Online (Sandbox Code Playgroud)

这有效......但它对方法没有帮助,只是字段.意思是我做不到

(Car)myGarage[0].doSomeCarStuff();
Run Code Online (Sandbox Code Playgroud)

所以我的问题是 - 我的车库里到底有什么?我试图获得直觉以及了解"幕后"发生了什么.


为了将来的读者,请简要总结以下答案:

  1. 是的,有一个CarmyGarage[]
  2. 作为一种静态类型语言,如果通过基于Vehicle超类的数据结构访问那些方法/字段,Java编译器将不会访问非"Vehicle"的方法/字段(例如Vehicle myGarage[])
  3. 至于如何解决,有以下两种主要方法:
    1. 使用类型转换,这将减轻编译器的顾虑,并将设计中的任何错误留给运行时
    2. 我需要铸造的事实说设计是有缺陷的.如果我需要访问非车辆功能,那么我不应该将汽车和船只存储在基于车辆的数据结构中.要么使所有这些功能属于Vehicle,要么使用更具体(派生)类型的结构
  4. 在许多情况下,组合和/或接口将是继承的更好替代方案.可能是我下一个问题的主题......
  5. 如果有人有时间浏览答案,那么还有许多其他好的见解.

java inheritance

259
推荐指数
10
解决办法
3万
查看次数

iOS SceneKit - 为材质透明度添加菲涅尔效果

我有一个描绘人体的几何节点。物体的材质是透明的

let node = newScene.rootNode.childNode(withName: "man_mesh", recursively: true)
let nodeMaterial = node?.geometry?.firstMaterial
nodeMaterial?.emission.contents = UIColor(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0)
nodeMaterial?.transparencyMode = .rgbZero
nodeMaterial?.transparent.contents = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
Run Code Online (Sandbox Code Playgroud)

我试图获得的效果是对象在面向相机的区域完全透明,但当多边形面向侧面时变得更加不透明......这会产生一种闪亮的蓝色边缘。像这样:

边缘效果

知道如何创建这种效果吗?

谢谢

编辑:另一个有趣的点:看起来 SceneKit 确实支持菲涅耳效应。该效果会影响反射贴图 - 然而,一旦将透明度应用于对象,它也会影响反射率(完全透明也会使反射率消失) - 我相信这是 Apple 的一个概念错误 - 一种材料可以是透明的,仍然反射光!

ios scenekit

5
推荐指数
1
解决办法
1326
查看次数

JavaScript Promise.all代码无法按预期工作

我有以下代码从mySQL数据库中获取信息.DB包括几个表,其中包括一个Activity表,具有channelId字段,Channel具有userId字段的User表和具有userName字段的表.该函数getAllProjectACtivities(user,project)返回一个Activity对象数组的promise ,每个对象包括所有Activity表字段.该函数findChannel(channelId)返回单个Channel对象的承诺,包括所有Channel表字段.该函数findUser(userId)返回单个User对象的承诺,包括所有User表字段.所有3个函数都会向数据库隐藏JSON Ajax请求,并且已经过测试,可以独立运行.

我在这里要做的是获取活动列表,为每个活动获取频道,为每个频道获取用户.然后我构建一个包含2个活动字段和一个用户字段的活动表.

为此,我需要一个3阶段DB访问,产生对象数组.以下是代码:

$(document).ready(function(){    
    var projNum=1;
    var userNum=1;
    var globalActivityList; //this global array will store data from the beginning of the promise chain to be used at the end of the chain
    $('#tableContainer').append('<table border="0" style="background-color: lightblue;"></table>');
    var table = $('#tableContainer').children();
//here goes:
    getUserProjectActivities(userNum,projNum)
        .then(function (activityList){
            table.append("<tr><th>Number</th><th>Description</th><th>Employee</th></tr>");
            globalActivityList=activityList;
            return Promise.all(activityList.map(function(activity){
                //alert(activity.activityChannelId);//******** shows the right stuff …
Run Code Online (Sandbox Code Playgroud)

javascript arrays map promise

2
推荐指数
1
解决办法
1167
查看次数

标签 统计

arrays ×1

inheritance ×1

ios ×1

java ×1

javascript ×1

map ×1

promise ×1

scenekit ×1