[英]C# inheritance (beginner)
对于您我认为的大多数人,我都有一些应该易于回答的问题:
我有以下课程:
class One
{
string first;
}
class Two : One
{
string second;
}
现在,我想将所有“一”值替换为“二”值。 所以我尝试了以下方法:
One one = new One();
Two two = new Two();
two = (Two) one; // <= this seems to not work
那么,我真的必须实现一个将一个成员的所有成员复制到两个成员的方法吗?
One
不会从Two
继承而来,那是行不通的。
类继承并不意味着隐藏或替换一个类的属性值,而是派生类是对其继承的基类的专门化。
例如:
public class Cat {
}
public class Dog {
}
这两个有什么共同点?
他们没有什么共同点?
让我们通过设置顺序来修改我们的模型。
public class Cat {
public bool HasHair { get { return true; } }
public int Legs { get { return 4; } }
public string Speaks { get { return "Meows"; } }
}
public class Dog {
public bool HasHair { get {return true; } }
public int Legs { get { return 4; } }
public string Speaks { get { return "Barkles"; } }
}
现在,为了节省您的时间和编码,我们该怎么办? 归纳两个类的共同点? 好的! 但是如何做到这一点呢?
public class Animal {
public bool HasHair { get { return true; } }
public int Legs { get { return 4; } }
public virtual string Speaks { get { return "Does a sound"; } }
}
// We can now inherit from Animal to write our Cat and Dog classes.
public class Cat : Animal {
public overrides string Speaks { get { return "Meows"; } }
}
public class Dog : Animal {
public overrides string Speaks { get { return "Barkles"; } }
}
您可以执行以下操作:
Dog dog = new Dog();
dog.Legs; // Because Legs is an Animal property, and a Dog inherits from Animal, then Dog has a property called Legs, since it got it from his base class.
现在,我们可以做:
Animal pet = (Animal)(new Cat());
就是说,您可以将Cat
铸成Animal
,因为它是 Animal
! 现在,您必须考虑到将Cat
转换为“声音”,而不是“嘶嘶作响”,因为通过将Cat
转换为Animal
,就是说您想与任何Animal
,只要它是Animal
。 因此,无论Cat
与Dog
是动物。
我们可以说不是每个动物都有四条腿,有些没有任何一条,而其他只有两条,这可以进一步推动我们的例子。 然后,我们将不得不概括和专门化。
简而言之:是的
就像已经说过的那样,“一个”不继承自“两个”,因此这里没有“逻辑”默认操作。 您应该研究转换运算符 。 这将使您在定义运算符后仍使用two =(Two)一种语法,如下所示(在def类中):
public static explicit operator Two(One o)
{
var t=new Two();
t.first=o.first;
t.second="default";//or whatever kind of default value you want
return t;
}
您不能将“一One
为“ Two
因为“ One
”不继承自“ Two
。 但是,另一种方法可以正常工作( Two two = new One();
)
为了从One
获得Two
,您必须创建一个新的Two
。 您可以有一个将“ One
到Two
所有成员复制的方法,也可以有一个为“ Two
的构造器,该构造器采用“一One
并从此处设置属性。
是的,你必须实现的方法是复制的所有成员one
到two
。 通常,您将创建一个构造函数:
public Two(One one) {
this.first = one.first;
}
// Elsewhere ...
Two two = new Two(one);
或者,如果你想在现有的情况下的值复制,则可能是一个实例方法做到这一点:
public void CopyValuesFrom(One one) {
this.first = one.first;
}
// Elsewhere ...
Two two = new Two();
two.CopyValuesFrom(one);
重要的是要记住,一个和两个只是内存中指向对象实例的指针。
如果我们用通俗易懂的英语写出来,它会显示如下内容:
One one = new One();
在内存中创建一个指向类型为
One
的对象的指针并将其标记为1 ,然后创建类型为One
的对象并将其放置在由one指示的内存位置。
two = (Two) one;
更换由两个通过一个引用的对象引用的对象,并把它当作好像它是类型的对象,
Two
除了明显的键入问题之外,这只会替换内存中的引用对象,而不会将值从一个对象复制到另一个对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.