基类中的虚拟方法是否可以引用/访问/使用子类中的静态变量?
它可能更容易用代码解释。在下面的示例中,是否可以使虚拟方法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??
}
最佳答案
基类中的虚拟方法是否可以引用/访问/使用子类中的静态变量?
不。除了事物的静态方面,您还试图访问变量,就好像变量是多态的一样。他们不是。
最简单的方法是制作一个抽象的虚拟属性,并在每个方法中覆盖它。然后,您在基类中的具体方法(可能根本不需要是虚拟的)可以调用abstract属性。
另外,如果您不介意每个实例都具有一个字段,只需使基类构造函数使用一个分隔符即可在构造函数中拆分,然后将其存储在基类声明的字段中:
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
-我只是检查行是否以给定的前缀开头。关于c# - 基类中的虚拟方法,可使用子类中的静态变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20600451/