Вы неправильно используете некоторые принципы OOD в своем коде. Например, вы смешиваете в своих классах статическое поведение (что-то вроде шаблона проектирования Singleton) и полиморфизм (вы используете абстрактный базовый класс, но без интерфейса базового класса). И поскольку у нас нет такого понятия, как «статический полиморфизм», мы должны разделить эти две роли.
Если вы опишите более подробно, какую проблему вы пытаетесь решить, возможно, вы получите более точные ответы.
Но в любом случае вы можете реализовать что-то вроде этого:
public class Cc : Ca
{
private Cc()
: base("Test")
{
//We may call protected setter here
}
private static Ca instance = new Cc();
public static Ca Instance
{
get { return instance; }
}
}
public abstract class Ca
{
protected Ca(string p1)
{
P1 = p1;
}
//You may use protected setter and call this setter in descendant constructor
public string P1
{
get;
private set;
}
}
static void Main(string[] args)
{
string s = Cc.Instance.P1; // is not null
}