2014-09-25 27 views
0

为什么getPlatformId()不可见的SalesforcePlatform在子类中的方法getPlatformName()?代码块不完整。 SalesforcePlatformPlatform的子女。它是在不同的包比Platform,但这不应该阻止其访问平台的保护方法,对吗?的Java为什么这种方法不可见

很抱歉,如果我错过了一些明显。

package com.dragon.dictionary; 

public class Platform extends RepositoryObject 
    implements IPlatform{ 

    protected final Long id ; 
    protected final String name; 
    protected static final String platformDbTbl = DragonConstants.TABLE_PREFIX + "platform"; 


    protected Platform(Long platformId, String platformName){ 
    id = platformId; 
    name = platformName; 
    }; 

    protected Platform(String platformName){ 
    Platform platform = Platform.getPlatformByName(platformName); 
    id = platform.getPlatformId(); 
    name = platformName; 
    }; 

    protected Long getPlatformId(){ 
    return this.id; 
    }; 

    protected String getPlatformName(){ 
    return this.name; 
    } 

    .... 

} 




package com.dragon.dictionary.salesforce; 

import com.dragon.dictionary.Platform; 

public class SalesforcePlatform extends Platform{ 

    // prevent instantiation 
    private SalesforcePlatform() { 
    super("salesforce"); 
    } 

    private SalesforcePlatform(Long platformId, String platformName) { 
    super(platformId, platformName); 
    } 

    public static SalesforcePlatform getPlatformByName(String platformName){ 
    Platform platform = Platform.getPlatformByName(platformName); 
    SalesforcePlatform salesforcePlatform = new SalesforcePlatform(platform.getPlatformId(), platform.getPlatformName()); 
    return salesforcePlatform; 
    } 
} 

编辑:

谢谢!因此,基于响应,你说,这将在子类中工作过:

private SalesforcePlatform(Platform platform) { 
    this.id = platform.getPlatformId(); 
    this.name = platform.getPlatformName(); 
    } 

回答

4

你是不是从调用子类的保护方法,而是从一个静态方法。 静态方法在子类中定义的事实是无关紧要的。

编辑:

谢谢!因此,基于响应,你说,这将在子类

这新更新的代码已经工作有两个问题: - 您PlatForm类没有默认的构造函数,所以你需要调用父类的构造函数并传递参数 - 您尝试分配的字段是最终的。它们将已经由您的超类构造函数设置。

+0

似是而非。但是,OP没有向我们显示调用代码,所以我们不能完全确定这一点。 – 2014-09-25 22:07:59

+0

@StephenC他向我们展示了'SalesforcePlatform salesforcePlatform =新SalesforcePlatform(platform.getPlatformId(),platform.getPlatformName());'在静态情况下,这是getPlatformId'的'唯一的发生。所以我认为这是问题 – Robin 2014-09-25 22:18:34

+0

谢谢@Robin我最终将保护的方法更改为public - – 2014-09-25 22:39:25

2

该规则表示:

的对象的被保护的成员或构造可以从它仅由代码中声明的封装,它负责该对象的执行外部访问。

请参阅here for the documentation