- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个制作动物列表的函数,其中一些是狗,一些只是动物。该函数将该列表返回给另一个函数,该函数只想提取出狗,这是可能的,因为 Animal 类有一个 bool isDog。
我的问题是,是否可以从动物( parent )类中提取特定于狗(特定于 child )的数据,又名。动物在引擎盖下还能是狗吗?
我尝试过的事情:
我有这两个接口(interface)
public interface IAnimal
{
string eyeColor;
int numLegs;
}
public interface IDog: IAnimal
{
double tailLength;
}
以及这两个实现
public class Animal: IAnimal
{
public string eyeColor{get;set}
public int numLegs {get; set;}
public bool isDog;
public Animal(string eyes, int legs){
this.eyeColor = eyes;
this.numLegs = legs
this.isDog = false;
}
}
public class Dog: Animal, IDog
{
public double tailLength {get;set;}
public Dog(double tail, string eyes)
{
this.tailLength = tail;
this.eyeColor = eyes;
this.numLegs = 4;
this.isDog = true;
}
}
这是两个函数的当前状态
List<Animal> getAnimals()
{
List<Animal> animals;
Animal a1 = new Animal("Blue", 4);
animals.Add(a1);
Animal a2 = new Animal("Green", 2);
animals.Add(a2);
Dog d1 = new Dog(2.3, "Brown");
animals.Add(d1);
Dog d2 = new Dog(3.5, "Black");
animals.Add(d2);
return animals;
}
void foo(){
IEnumerable<IAnimal> sample = getAnimals();
var x = totalTailLength(sample.Where(d => d.isDog));
}
double totalTailLength(IEnumerable<IDog> dogs){
return dogs.Sum(d => d.tailLength);
}
谢谢
最佳答案
是的,你绝对可以做到。如果您使用您的确切代码并修复一些错误,那么您会发现它有效:
有两个语法错误,您错过了一个分号。
字段不能是接口(interface)成员,所以你需要让它们成为属性。
Dog
需要调用父级的构造函数,这也消除了手动设置这些属性的需要:
public Dog(double tail, string eyes) : base(eyes, 4)
{
this.tailLength = tail;
this.isDog = true;
}
在 getAnimals
,你需要初始化列表:
List<Animal> animals = new List<Animal>();
在 foo
, sample
类型为 IEnumerable<IAnimal>
, 所以元素的类型是 IAnimal
.然而,该类型没有 isDog
属性(因为它在类上而不在接口(interface)上)。因此,要么将类型更改为 IEnumerable<Animal>
, 或将成员移动到界面。
totalTailLength
期望一个可枚举的 IDog
但是sample.Where()
返回 IAnimal
s(或 Animal
s,如上所述)。由于您过滤了元素,因此您应该转换可枚举的:
var x = totalTailLength(sample.Where(d => d.isDog).Cast<IDog>());
然后所有内容都会编译,如果您实际打印出结果,您会得到正确的结果。
对象的类型不附加到引用该对象的变量,而是附加到对象本身。所以每个 Dog
在你的动物列表中仍然知道它是一只狗。这实际上可以让你摆脱 isDog
成员,因为您可以使用 is
operator 检查对象是否属于特定类型:
IAnimal someAnimal = new Dog();
bool isADog = someAnimal is Dog; // true
您还可以将其与 LINQ 结合使用来过滤 Dog
你的元素IAnimal
使用 Enumerable.OfType<T>
列出:
var x = totalTailLength(sample.OfType<IDog>());
关于c# - 将子类添加到 List<parent> 时,特定于子类的数据是否丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37688271/
如果我需要选择第 10 个父级,是否有更简洁的方法,然后重复 .parent() 10 次? $('#element_id').parent().parent().parent().parent().
从 angularJS 指南中的“如何创建通信指令”开始,https://docs.angularjs.org/guide/directive , 我正在尝试使用该布局来制作可导航的表单。 问题在于指
我有一个 jQuery 函数,需要获取元素父元素的位置。 它看起来像: function show(e) { //debugger; var nextTab
我正在尝试修复这个难看的代码。 RadGrid gv = (RadGrid) (((Control) e.CommandSource).Parent.Parent.Parent.Parent.Pare
我有一个 A 标签,可以触发它的曾曾曾祖 parent 的动画。以下所有方法都可以,但哪一个最有效,为什么? $(this).parent().parent().parent().parent().p
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我在尝试定位绝对定位的 div 时遇到了一些问题。我猜它的工作方式应该是这样,但是我希望它与父对象的父对象而不是父对象一起使用,因为我有一个下拉列表,当我希望它像第一个一样保持在顶部时,它会跟随父对象
我正在做一些非常基本的 jQuery 东西,真正开始,我经常通过做类似的事情来向上导航 dom $(this).parent().parent().addClass('hello'); 我只是想知道是
此 HTML 结构有一个 div#page,其中当前页面内容将通过 Ajax 加载。内容始终由 section 标记组成,这些标记可以具有动态高度(相对于浏览器的百分比)或静态高度(以像素为单位)。
在 javascript 中是否有一种简单的方法来定位父对象的父对象? 我使用 this.parentNode 作为函数的元素来选择父节点,我尝试了 this.parent.parentNode 和
当遍历 pager.Pages 对象的 foreach 循环时,$data 是 self(正如预期的那样)。但是,$parent 应该是寻呼机对象,但它返回的是 WaterQualityResultV
在架构中,我想根据父级的 sibling 调整架构。 例如:如果 toggleMonday 为真,那么 weekdays -> monday 应该有一个特定的验证模式。 现在下面的例子有效。但是,它非
我想要完成的是,当用户将焦点放在文本框上时,其中的字段集将添加一个类“active_fieldset”,以便提供用户在表单中的位置的良好视觉提示。使用以下 javascript,它确实会影响父字段集,
我创建了这个函数来保存我的taches sauverTache(tache:Tache){ this.editionEnCours = true; tache.estReelle =
所以..这是我的问题..我有以下代码(示例): var GameObject = function (posX, posY, width, height) { this.posX = posX;
所以,我是 jQuery 的新手,我正在尝试更改关于函数触发器的 2 个级别的 div: 这是我的第一次尝试:我尝试找到最接近的“.node”,它是所有其他 div 的父级并编辑子 div。 fun
我想了解为什么使用 ng-repeat在repeat 的item 上有某个controller,那个item 的parent 和那个item 的祖父是同一个controller。我期待祖父成为父 Co
我想从我的组件 Controller 之一将 jsonModel 设置为我的 SAPUI5 组件。在组件内,我使用应用程序或 splitapp。 我想避免通过 ID 获取元素。从组件内的某个位置获取层
我不确定如何在标题上准确地表达出来,因为问题在我的场景中太具体了,但无论如何基本上我有两个类似于下面的外部类: class Config { public level: number = 1;
在我正在编写的这个脚本中,我发现自己连续使用 .parent() 最多七次来获取元素。虽然这有效,但似乎可以/应该有一种更简单的方法来完成我不知道的这个/功能。除了更多元素上更具体的类/ID 之外,还
我是一名优秀的程序员,十分优秀!