Статические члены не наследуются, хотя получить доступ к статическому члену через производный тип довольно сложно.Например, в следующем коде
class P
{
public static string X;
}
class Q : P { }
class R : P { }
вы можете получить доступ с P.X
через P.X
или Q.X
или R.X
, но это все еще то же поле:
P.X = "Hello";
Q.X = "World";
Console.WriteLine(R.X); // prints "World"
Как вы обнаружили, вы не можете сделать это с помощью параметров общего типа.Но доступ к X
, хотя параметр типа на самом деле не имеет большого смысла, потому что все, что вы изменяете, это P.X
, который вы пишете напрямую без параметра универсального типа.
Я недействительно уверен, что вы пытаетесь достичь.Если у вас есть абстрактный класс A
и вы хотите, чтобы все экземпляры типов, производных от A
, имели определенное свойство, вы можете определить это:
abstract class A
{
public abstract string X
{
get;
}
}
class A1 : A
{
public override string X
{
get { return "A1"; }
}
}
class A2 : A
{
public override string X
{
get { return "A2"; }
}
}
Если вы хотите связатьбит информации с типом (не экземпляр), вы можете определить статическое поле, которое параметризовано с типом, используя универсальный класс:
class Info<T>
{
public static string X;
}
Info<A1>.X = "Hello";
Info<A2>.X = "World";
Console.WriteLine(Info<A1>.X); // prints "Hello"
Console.WriteLine(Info<A2>.X); // prints "World"
Как насчет этого?
abstract class Job
{
public abstract string ExePath
{
get;
}
public void Execute(string[] args)
{
Console.WriteLine("Executing {0}", this.ExePath);
}
}
abstract class Job<T> where T : Job<T>
{
public override string ExePath
{
get { return JobInfo<T>.ExePath; }
}
}
class ConcreteJob1 : Job<ConcreteJob1> { }
class ConcreteJob2 : Job<ConcreteJob1> { }
static class JobInfo<T> where T : Job<T>
{
public static string ExePath;
}
static class JobInfoInitializer
{
public static void InitializeExePaths()
{
JobInfo<ConcreteJob1>.ExePath = "calc.exe";
JobInfo<ConcreteJob2>.ExePath = "notepad.exe";
}
}
Это близко соответствует процессу, который вы описываете в своем комментарии.Это должно работать, хотя я не разработал бы настраиваемую модель Job.