Java OOP概念问题

时间:2011-04-02 12:10:23

标签: java oop

我对java OOP概念很新。我在java中实现一些关于遗传学的东西时遇到了一些问题。这是场景。

人类细胞含有23对染色体。每对中的每条染色体都有数千个基因。基因的每个拷贝称为等位基因。这些等位基因决定了人类的不同特征(眼睛颜色,身高,头发颜色,遗传疾病等)。等位基因可以是显性的或隐性的。

显性等位基因总是在其携带者的基因组中表达。然而,如果当存在相同基因的显性等位基因时不表达来自一个等位基因的信息,则它是隐性等位基因。基因的隐性等位基因的特性在于它可以存在于基因组中并且在几代中传播而不在其表型中表达其携带者。如果没有显性等位基因,则该基因的两个拷贝具有相同的隐性等位基因(纯合隐性),然后表达隐性特征。

现在,在一对儿童细胞染色体上,一条染色体来自母亲,另一条来自父亲。因此,假设父亲染色体的位置1包含负责眼睛颜色的基因的等位基因(显性或隐性),在同一位置的母染色体必须包含同一基因的另一个等位基因(显性或隐性)。 那么我怎样才能正确地代表这些类等位基因,基因呢?这是我到目前为止所拥有的

Allele.java
    /**
 * 
 */
package project_try;

/**
 * @author mkab
 *
 */
public class Allele {

    private String trait;
    private int type;

    public Allele(String trait, int type) {
        this.trait = trait;
        this.type = type;
    }

    public boolean equals(Allele a){
        if(this.getTrait().equals(a.getTrait()) && this.getType()==a.getType())
            return true;

        return false;
    }

    /**
     * @return the trait
     */
    public String getTrait() {
        return trait;
    }

    /**
     * @param trait the trait to set
     */
    public void setTrait(String trait) {
        this.trait = trait;
    }

    /**
     * @param type the type to set
     */
    public void setType(int type) {
        this.type = type;
    }

    /**
     * @return the type either recessive(0) or dominant(1)
     */
    public int getType() {
        return type;
    }

    /*
     * (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Allele [trait=" + trait + ", type=" +
        (this.getType()==0?"recessive":"dominant")+ "]";
    }
}

Gene.java

    /**
 * 
 */

package project_try;

import java.util.Random;

/**
 * @author mkab
 *
 */
public class Gene implements Cloneable {

    private Allele allele;

    public Gene(){
        super();
    }

    public Gene(Allele allele){
        super();
        this.allele = allele;
    }

    /**
     * Randomly selects a trait from trait1 or trait2 and returns a new Gene with that trait
     * @param trait1
     * @param trait2
     * 
     * @return a new Gene
     */
    public Gene randomAllele(Allele trait1, Allele trait2){
        Allele allele = null;
        Random rand = new Random();
        int i = rand.nextInt(2);// generate between 0 and 2: only 2 possibilities: 0 or 1

        switch(i){
        case 0:
            allele = trait1;
            break;

        case 1:
            allele = trait2;
            break;
        }

        return new Gene(allele);
    }

    /**
     * Clones a gene
     */
    public Gene clone() throws CloneNotSupportedException{
        Gene g;
        g = (Gene) super.clone();
        return g;
    }

    public boolean equals(Gene g){
        if(this.getAllele().equals(g.getAllele()) && 
                this.getAlleleType() == g.getAlleleType() )
            return true;
        return false;
    }

    /**
     * @param allele the allele to set
     */
    public void setAllele(Allele allele) {
        this.allele = allele;
    }

    /**
     * 
     * @return - the allele 
     */
    public Allele getAllele() {
        return allele;
    }

    /**
     * 
     * @return the trait of the gene or allele
     */
    public String getAlleleTrait(){
        return allele.getTrait();
    }

    /**
     * 
     * @return allele type. Either recessive or dominant
     */
    public int getAlleleType(){
        return allele.getType();
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Gene [" + allele +"]";
    }
}

我怎样才能代表类染色体?我正在考虑使用基因类型的arraylist。但是使用这个的问题是我无法定义例如阵列的第一个位置应该用于眼睛颜色,第二个位置用于高度等。 有什么建议吗?感谢

2 个答案:

答案 0 :(得分:1)

我没有看到

的问题
List<Chromosomes> chromosomes = new ArrayList<Chromosomes>();

定义

class Chromosome {
    // values
}

class EyeColourChromosome extends Chromosome {
    // define specific values
}


class HeightChromosome extends Chromosome {
    // define specific values
}

或者...

您可以使用工厂模式创建特定的染色体,如

class Chromosome {
    // values
    public static Chromosome chromosomeFactory(String type) {
        switch(type) {
        case EYE_COLOUR:
            return new EyeColourChromosome(...);
            break;
        case HEIGHT:
            return new HeightChromosome(...);
            break;
        }
    }
}

答案 1 :(得分:0)

也许使用LinkedHashMap,其中关键是他的眼睛颜色,高度等,以及值是......的值。使用LinkedHashMap意味着您仍然保持排序,因为这似乎很重要。