很难在这个标题上加上标题,如果你能想到更好的标题,我会更新它。但我正在寻找的是一种能够从实例对象引用静态值的方法。例如,假设您有一个名为Animal
的抽象类和两个名为Cat
和Dog
的子类。在抽象类中,我想要一个名为GenusSpecies
的实例变量,当然,这在动物级别没有值,因为它是一个抽象类,但每个{{1}将具有相同的值,但它将与所有狗不同。但是,我希望Cat
和Cat
类具有每种类型实例的静态值,但我不想在每个实例上设置它的值,但我想要能够像实例变量一样引用它,因为我将拥有一个通用变量,如。
Dog
但我希望
Animal a = new Cat("Garfield");
但我不想放
a.GenusSpecies == "Felis catus"
在构造函数中。但是,能够引用GenusSpecies = "Felis catus";
静态值会很好,因为它总是与Cat类型的每个实例相同。我知道在某种程度上我将两种方式之间的区别分开来引用它,但有没有办法实现这两种引用类型?我希望我已经正确解释了这一点。
答案 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);
}
}