我想创建一个Dog,Cat,Lion等的子类。我希望每只动物都能创建一个自己的对象。当它在自己的物体上创造时,我希望它能够跟踪有多少动物类型。因此,例如,如果有3只狗,那么狗类知道它有4只狗。所有其他人都一样。
Dog的示例代码:
class Dog {
static int numberOfDogs = 0;
public Dog() {
}
public void AddDog() {
numberOfDogs++;
}
public void MinusDog() {
numberOfDogs--;
}
}
现在,如果我想为猫做同样的事情,我需要重写所有代码并将dog
替换为cat
,依此类推。
我想要做的是创建一个父类,它在一个地方包含所有重复的代码,但是当我创建一个Dog时,它将添加到dog变量,并且与cat相同,依此类推。我对父类的看法:
class Animal {
public static int NumberOfAnimals;
public void AddAnimal() {
NumberOfAnimals++;
}
public void MinusAnimal() {
NumberOfAnimals--;
}
}
如果我从Dog
派生Animal
并致电dog.AddAnimal()
,它将添加到所有Animal
的静态变量中。我怎样才能使Dog
中的静态变量可以使用父类Animal
进行更改?
或者,如果我提出错误的问题,我怎样才能得到许多具有许多静态变量的动物所需的结果?
答案 0 :(得分:1)
我不相信课程本身就是计算你有多少人的合适地方。但是在你的问题中没有足够的信息来对更广泛的目标做出很好的评估。
就你所要求的而言,你有很多选择。这是一对......
一种简单的方法是让基类拥有一个字典:
class Animal
{
private static readonly Dictionary<Type, int> _counts =
new Dictionary<Type, int>();
protected Animal()
{
int count;
_counts.TryGetValue(this.GetType(), out count);
_counts[this.GetType()] = count + 1;
}
}
class Dog : Animal { ... }
另一个选择是让运行时处理特定于类型的计数:
class Animal<T>
{
private static int _count;
protected Animal()
{
_count++;
}
}
class Dog : Animal<Dog> { ... }
详细说明第二种选择,因为对C#新手来说可能有点混乱。从你的评论开始......
什么是&lt; T&gt;你有吗?
Animal<T>
类声明的一部分,它使它成为泛型类。也就是说,在使用时,必须为类提供类型参数(即某些其他类型的名称),其中该类型参数以有用的方式专门化泛型类型(其中&#34;有用的&#34;取决于你如何使用它。在这种特殊情况下,我的示例使基类具有通用性,以利用泛型类型的静态字段对于使用的每个不同类型参数的唯一这一事实。
也就是说,对于声明的类class Dog : Animal<Dog> { ... }
,基类中的字段_count
实际上是不同的变量,而不是某些其他声明的类,例如class Cat : Animal<Cat> { ... }
。这样,每个子类(例如Dog
,Cat
等)都会为该字段获取自己的值。
在任何一种情况下,您仍然需要弄清楚您实际上能够获取计数并使用它们的方式。从你的问题中不清楚它是如何适应的。
另请注意,以上都不是线程安全的,而静态成员通常是预期的。我已经省略了那个部分,但是你想要添加同步以确保线程安全,所以没有任何意外。
所有这些都说,如果这实际上是你的头脑,而你实际上刚开始学习OOP,继承和C#,我会回到我原来的陈述,我不是确信在课堂上实现这一点实际上是正确的地方。
更好的方法是让其他类了解您正在创建的不同Animal
个对象,并以某种方式跟踪它们。例如,它可以有Dictionary<Type, List<Animal>>
,其中键Type
可以是例如typeof(Dog)
。 typeof(Cat)
,List<Animal>
等,值Animal
只能是特定类型的List<T>
对象的列表。然后,您不仅可以立即访问计数(因为Count
类具有public class AssetCategoryViewModel : IEnumerable<AssetCategory>
{
DataModelContext db = new DataModelContext();
public AssetCategory AssetCategory { get; set; }
public Guid Id { get; set; }
public IList<AssetCategory> AssetCategoryList { get; set; }
public IEnumerable<SelectListItem> AssetCategoryNames { get; set; }
public AssetCategoryViewModel()
{
AssetCategoryList = (from x in db.AssetCategory
select x).ToList();
AssetCategoryNames = (from x in db.AssetCategory
select new SelectListItem
{
Text = x.Name,
Value = x.Code
});
}
public IEnumerator<AssetCategory> GetEnumerator()
{
return AssetCategoryList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
属性),您还可以立即检索您创建的所有对象。
我不能比那更具体,因为再次,你的问题对于你实际要对这些对象做些什么相当模糊。如果你要做的只是学习OOP以及继承是如何工作的,那么最好不要担心你现在创建的对象的 count 。还有很多其他你可以关注的东西,它们仍然会给你实质性的思考。 :)
答案 1 :(得分:0)
这不是一个好的设计,但我更愿意坚持你的主意。 请注意,通用类对您来说是一个完美的解决方案。
看看这个:
抽象动物类
> V9 V11 V13 V15 V17 V19 V21 V23 V25 V27 V29 V31 V33 V35 V37 V39
1 90009901 90009902 90009911 90009999 90010001 90010002 90010003 90010004 90010005 90010006 90010007 90010008 90019901 90020003 90020004 90020005
狗作为儿童班
public abstract class Animal
{
public static List<Type> AnimalList=new List<Type>();
protected Animal(Type animalType)
{
AnimalList.Add(animalType);
}
}
主要方法:
public class Dog : Animal
{
public Dog(Type animalType) : base(animalType)
{
}
public static int CountDogs
{
get { return AnimalList.Count(x => x == typeof (Dog)); }
}
}
答案 2 :(得分:-1)
如果你想让Class Dog成为Animal的派生类,那么你可以从Class dog访问Class Animal - &gt;
`class Animal {
public void AddAnimal(int&amp; NumberOfAnimals;) {NumberOfAnimals ++; }
public void MinusAnimal(int&amp; NumberOfAnimals) {NumberOfAnimals--; } }
类狗:公共动物{
int numberOfDogs = 0;
动物对象;
public void AddDog() {obj。 AddAnimal(numberOfDogs); }
public void MinusDog(){obj.MinusAnimal(numberOfDogs); '}
如果你想使numberOfDogs静止,当你添加或减去时,你将无法增加或减少它的值