2013-12-15 27 views
1

基类中的虚方法是否可以引用/访问/使用来自子类的静态变量?基类中的虚方法使用子类中的静态变量

它可能更容易在代码中解释。在以下示例中,可以使虚拟方法Arc::parseFile()查找data_arc

public class Base { 
    public static string DATA_3D = "data_3d"; 

    public virtual void parseFile(string fileContents) { 

     // Example of file contents: "data_3d (0,0,0),(1,1,1),(2,2,2) 
     // Example of file contents: "data_arc (0,0,0),(1,1,1),(2,2,2) 
     // Example of file contents: "data_point (0,0,0) 
     string my3dPoints = fileContents.Split(DATA_3D)[1]; 
    } 
} 

public class Arc : Base { 
    public static string DATA_3D = "data_arc"; 

    // Will the base method parseFile() correctly look for "data_arc" 
    // and NOT data_3d?? 
} 
+0

这真的不是一个好主意。为什么不添加虚拟getter方法并将静态字符串值分配给类构造函数中的数据成员? – OldProgrammer

+0

@OldProgrammer我之所以这样做是因为如果它能够工作,那将是一个非常优雅和简单的解决方案。只需要更改1个变量值(静态变量),并且解析函数将适用于所有类型的字符串(一系列顶点)。 –

+0

您是否注意到隐藏'Base'字段中的'Arc'字段的警告?隐藏基类中的成员永远不是一个好主意。你想要一个'虚拟'只能获取属性。不幸的是,它不能是'static',但'get'访问器返回的值在任何意义上都可以是常量或“静态”的。 –

回答

4

是否有可能在基类虚拟方法来引用/接入/从一个子类使用一个静态变量?

不是,即使除了事物的静态方面,你试图访问变量就好像变量是多态的。他们不是。

最简单的方法是制作一个抽象的虚拟属性,并在每种方法中重写它。然后,您在基类中的具体方法(可能不需要虚拟)可以调用抽象属性。

另外,如果你不介意每个实例字段,只是让你的基类的构造函数需要一个分隔符在构造函数中分裂,并存储在基类声明的字段:

public class Base 
{ 
    private readonly string delimiter; 

    protected Base(string delimiter) 
    { 
     this.delimiter = delimiter; 
    } 

    // Quite possibly no need for this to be virtual at all 
    public void ParseFile(string fileContents) 
    { 
     string my3dPoints = fileContents.Split(delimiter)[1]; 
    } 
} 

顺便说一句,我不确定在这种情况下我会使用Split给你的数据文件 - 我只是检查行是否以给定的前缀开头。

+0

+1。我认为这个问题应该回答“是的,基类可以使用'Arc.DATA_3D'就好了,但它不是你正在寻找的东西”。 –

+1

@AlexeiLevenkov:但问题实际上是询问在Arc实例上调用'parseFile'是否会自动使用'Arc.DATA_3D',在这种情况下,答案是“否”。 –

相关问题