C#半静态半抽象变量

时间:2016-11-19 08:32:15

标签: c# inheritance static instance abstract

很难在这个标题上加上标题,如果你能想到更好的标题,我会更新它。但我正在寻找的是一种能够从实例对象引用静态值的方法。例如,假设您有一个名为Animal的抽象类和两个名为CatDog的子类。在抽象类中,我想要一个名为GenusSpecies的实例变量,当然,这在动物级别没有值,因为它是一个抽象类,但每个{{1}将具有相同的值,但它将与所有狗不同。但是,我希望CatCat类具有每种类型实例的静态值,但我不想在每个实例上设置它的值,但我想要能够像实例变量一样引用它,因为我将拥有一个通用变量,如。

Dog

但我希望

Animal a = new Cat("Garfield");

但我不想放 a.GenusSpecies == "Felis catus"  在构造函数中。但是,能够引用GenusSpecies = "Felis catus";静态值会很好,因为它总是与Cat类型的每个实例相同。我知道在某种程度上我将两种方式之间的区别分开来引用它,但有没有办法实现这两种引用类型?我希望我已经正确解释了这一点。

4 个答案:

答案 0 :(得分:0)

public class GenusAttribute : Attribute
{
    public string GenusName {get; private set;}
    public GenusAttribute(string genusName)
    {
        GenusName = genusName;
    }
}

[GenusAttribute("Catus")] // or simply [Genus("Catus")], no need to type 'Attribute' in here
public class Cat : Animal
{

}

答案 1 :(得分:0)

我现在正打电话,所以我不确定这段代码是否有用,但是你的基类不能有一个调用静态属性的实例属性。

abstract class Base
{
    public abstract static string Value { get; }

    public abstract string InstanceValue { get { return Value; } }
}

我可以稍微检查一下,当我可以上电脑来测试它是否有效。

答案 2 :(得分:0)

通过这里给出的一些建议,我提出了一个解决方案,虽然与我原本希望的有些不同。在创建新的子类时,我一直在寻找具有最少开销的解决方案,并且想要一个感觉不是完全黑客的解决方案,或者只是比我正在寻找的更详细的代码。所以我找到了一个解决方案,我创建了两个类似于TheLethalCoder解决方案的变量。

public abstract class Animal
{
    public static string GENUSSPECIES;
    public abstract string GenusSpecies { get; }

    public string Name;

    public Animal(string name)
    {
        Name = name;
    }
}

public class Cat : Animal
{
    public static new string GENUSSPECIES = "Felis Catus"; 

    public Cat(string name) : base(name) { }

    public override string GenusSpecies
    {
        get { return Cat.GENUSSPECIES; }
    }
}

起初,我试图从实例变量中访问一个静态值,我相信这应该是可能的,但是,它只是在这种语言中不可用。所以我做了下一个最好的事情并将真值存储为静态值,因为它永远不会改变,但我创建了一个单独的实例属性,它返回该静态值。在添加新的子类时,它很容易维护,根据我想要访问的值,我必须以不同的方式引用它们,这只是有点愚蠢。

答案 3 :(得分:-2)

您可以在GenusSpecies中将Animal声明为(只读)字符串字段,并添加一个构造函数,该值将相应地设置为实际被实例化的Type

public abstract class Animal
{
    public readonly string GenusSpecies;
    public string Name { get; set; }

    public Animal(string name)
    {
        Name = name;

        if (this is Dog)
            GenusSpecies = "Canis";
        else if (this is Cat)
            GenusSpecies = "Felis catus";
    }
}

public class Dog: Animal
{
    public Dog(string name): base(name)
    {

    }
}

class Cat : Animal
{
    public Cat(string name): base(name)
    {

    }
}

这样您就可以在Main代码中找到:

class Program
{

    static void Main(string[] args)
    {

        Dog myDog = new Dog("myDog");
        Cat myCat = new Cat("myCat");
        Animal a = new Cat("Garfield");

        Console.WriteLine("Dog {0} has GenusSpecies:{1}", myDog.Name, myDog.GenusSpecies);
        Console.WriteLine("Cat {0} has GenusSpecies:{1}", myCat.Name, myCat.GenusSpecies);
        Console.WriteLine("Animal {0} has GenusSpecies:{1}", a.Name, a.GenusSpecies);

    }
}