抽象类与子类(白马非马,离坚白)

白马非马,是公孙龙提出的一个逻辑问题。感兴趣的可以点击链接视频 https://www.bilibili.com/video/BV1vp4y147sM?from=search&seid=17824925906438171091&spm_id_from=333.337.0.0

主要论证的是白马非马这个观点。

 

那么从集合的角度看这个问题:

马是概念(抽象类),定义有属性形态、颜色。
白马是马的子类,具有马特有的颜色(定义了颜色为白)。
白马属于马,白马不是马,马包含白马。
人们把白马、黑马、黄马等具有相似形态的一类事物统称为马,颜色定义了,没有初始化。好了,白马符合马所具有的形态,颜色为白,属于马的范畴。

 

A==B的充分必要条件是:A∈B && B∈A     或者A∩B = A   &&  A∩B = B

这里白马属于马,但马不属于白马,所以白马与马不相等。

白马 == 马  false

白马 != 马  true

 

 

 

 

 下面是代码的:

public abstract class Horse {
    //马的颜色
    String color;

    //马所具有的的特征
    protected void feature(){
        System.out.println("马是一种生物,四条腿走,跑的快,吃草......");
    }

    public String getColor() {
        return color;
    }

    //初始化颜色属性
    public Horse(String color) {
        this.color = color;
    }

    @Override
    public boolean equals(Object obj) {
        return color.equals(((Horse)obj).color);
    }
}

  

public class WhileHorse extends Horse {
    //初始化颜色
    public WhileHorse(String color) {
        super(color);
    }

    public void fly(){
        System.out.println("白马特殊技能,会飞.......");
    }

}

  

public class BlackHorse extends Horse {
    //初始化颜色
    public BlackHorse(String color) {
        super(color);
    }

    public void swing(){
        System.out.println("黑马特殊技能,会游泳.......");
    }

}

  

public class testHorse {
    public static void main(String[] args) {
        Horse horse1 = new BlackHorse("black");
        horse1.feature();
        System.out.println(horse1.getColor());
        specialSkill(horse1);

        System.out.println("--------------------------------------------------------");
        Horse horse2 = new WhileHorse("while");
        horse2.feature();
        System.out.println(horse2.getColor());
        specialSkill(horse2);

        System.out.println("----------------------------------");
        //马是抽象,概念,没法直接初始化,需要具体的指向一种类。
        //Horse horse = new Horse();         //wrong, can not be instantiated,白马与马没法比较
        System.out.println(horse1.equals(horse2));
        System.out.println(horse2.equals(new WhileHorse("while")));
    }

    private static void specialSkill(Horse horse1) {
        if (horse1 instanceof BlackHorse) {
            ((BlackHorse) horse1).swing();
        }else if (horse1 instanceof WhileHorse) {
            ((WhileHorse) horse1).fly();
        }
    }
}

  结果:

马是一种生物,四条腿走,跑的快,吃草......
black
黑马特殊技能,会游泳.......
--------------------------------------------------------
马是一种生物,四条腿走,跑的快,吃草......
while
白马特殊技能,会飞.......
----------------------------------
false
true

 

离坚白

顺便也看了下离坚白。

公孙龙在《坚白论》中的核心论点是“离坚白”,即“坚”与“白”两种属性是分离的,不依赖于具体事物而存在,独立自藏。“离也者,藏也。”

一块石头,用手触碰感觉硬则是坚石,藏了白,为硬石。

一块石头,通过眼睛视觉可以看到白色,藏了硬,为白石。

坚白石,不可三分“坚”、“白”、“石”;可二分“坚石”、“白石”。

理解应该不到位,下面代码就当看下吧

public abstract class Stone {
    private String color;
    private String hardness;

    public Stone(String color, String hardness) {
        this.color = color;
        this.hardness = hardness;
    }

    @Override
    public String toString() {
        return "Stone{" +
                "color='" + color + '\'' +
                ", hardness='" + hardness + '\'' +
                '}';
    }

}

public class ConcreteStone extends Stone{
public ConcreteStone(String color, String hardness) {
super(color, hardness);
}

static class Builder{
private String color;
private String hardness;

public Builder seeColor(String color){
this.color = color;
return this;
}

public Builder touchHardness(String hardness){
this.hardness = hardness;
return this;
}

public Stone buildStone(){
return new ConcreteStone(this.color, this.hardness);
}

}
}

public class StoneTest {

public static void main(String[] args) {
Stone whileStone = new ConcreteStone.Builder().seeColor("while").buildStone();
Stone hardStone = new ConcreteStone.Builder().touchHardness("hard").buildStone();
Stone hardWhileStone = new ConcreteStone.Builder().touchHardness("hard").seeColor("while").buildStone();
System.out.println(whileStone);
System.out.println(hardStone);
System.out.println(hardWhileStone);
Stone concreteStone = new ConcreteStone.Builder().buildStone();
System.out.println(concreteStone);
}
}
 

 

最后:代码其实也是一种语言,反映了事物的属性、行为,还有逻辑。

posted @ 2021-10-05 22:46  炼金术士0z  阅读(416)  评论(0编辑  收藏  举报