Статические элементы не наследуются, хотя смутно можно получить доступ к статическому элементу через производный тип. Например, в следующем коде
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";
}
}
Это точно соответствует процессу, который вы описываете в своем комментарии. Он должен работать, хотя я не планирую настраивать модель работы.
Я не совсем уверен, чего вы пытаетесь достичь. Можете ли вы расширить? – dtb
Позвольте мне добавить немного более подробную информацию, чтобы помочь лучше понять требование: «a» представляет собой абстракцию для работы; поля в задании будут использованы для запуска процесса. любой данный подкласс «a» представляет собой конкретный тип работы. пусть «k» - один из таких подклассов. все экземпляры «k» имеют один общий атрибут. это верно для всех видов работы. существует другой класс «b», который работает над любой работой (т. е. «b» работает с использованием любого подкласса «a»). Я пытаюсь установить общий атрибут для заданного типа задания через «b». Есть ли способ достичь этого? – Aadith
Помимо всех комментариев о статичности, вы также пытаетесь присвоить 'int' (10) место хранения' string' (x). AFAIK, это тоже не полетит. –