关于c#:如何定义子类使用的常量?

How to define the constants the used also by the subclass?

我需要定义一些将由基类及其子类使用的常量。不确定定义它们的正确方法。

我理解const、readonly、static const以及public、protected和private(虽然我很少在c中看到protected)。如何定义这些常量?它们应该是public const、public readonly、private constant或private readonly,并使用public getter/setter来使用子类,还是应该定义为protected?

另一个问题是关于基类中的变量filepath。filePath将被基类中的一些函数用作占位符(实际值将由子类提供),我是否应该将其定义为虚拟的?

有人能提供一般规则来遵守吗?以下是我的一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class BaseClass
{
    public const string Country ="USA";
    public const string State ="California";
    public const string City ="San Francisco";

    public virtual string FilePath
    {
        get
        {
            throw new NotImplementedException();
        }
         set
        {
            throw new NotImplementedException();
        }
    }
}

public class Class1 : BaseClass {

     public Class1() {
         FilPath ="C:\test";
     }

     public string GetAddress() {
       return City +"," + State +"," + Country;
     }

     public void CreateFile() {
       if (!Directory.Exist(FilePath)) {
            //create folder, etc
        }
     }        
}


如果您可以将常量定义为const,那么就这样做。如果不可能的话,就用static readonly

如果常量要在类之外使用,那么它们必须是internalpublic。如果只有基类及其后代要使用它们,那么就让它们成为protected

如果子类可以提供FilePath,则必须是virtual。如果必须由子类提供,则应为abstract


我将把baseclass设置为抽象类(参见http://msdn.microsoft.com/en-us/library/sf985hc5(v=vs.71.aspx)。至于常量与静态只读,主要是一个味觉问题。

1
2
3
4
5
6
7
public abstract class BaseClass
{
    // ... constant definitions

    // Members that must be implemented by subclasses
    public abstract string FilePath { get; set; }
}