C#继承(初学者)
我有一件事对你们大多数人来说应该很容易回答,我想: 我有以下课程:C#继承(初学者),c#,inheritance,C#,Inheritance,我有一件事对你们大多数人来说应该很容易回答,我想: 我有以下课程: 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=newone(); 两个=新的两个(); 二=(二)
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=newone();
两个=新的两个();
二=(二)一;// 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/CUT>将“做一个声音”,而不是“MeWOLLIN”,因为通过类型化>代码> CAT/COM> > <代码>动物< /代码>,你是说你想和任何<代码>动物< /代码>一起工作,只要它是一个。所以猫和狗都是动物
我们可以进一步推广我们的例子,并不是每种动物都有四条腿,有些没有,有些只有两条腿。然后,我们必须进行相应的泛化和专门化。
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/CUT>将“做一个声音”,而不是“MeWOLLIN”,因为通过类型化>代码> CAT/COM> > <代码>动物< /代码>,你是说你想和任何<代码>动物< /代码>一起工作,只要它是一个。所以猫和狗都是动物
我们可以进一步推广我们的例子,并不是每种动物都有四条腿,有些没有,有些只有两条腿。然后,我们必须进行相应的概括和专门化。您不能将
1
转换为2
,因为1
不是从2
继承的。另一种方法也可以(Two-Two=new-One();)
为了从
One
中获得Two
,您必须创建一个新的Two
。您可以有一个方法将One
的所有成员复制到Two
,或者您可以有一个Two
的构造函数,它接受One
并从那里设置属性。您不能将One
强制转换为Two
,因为One
不是从Two
继承的。另一种方法也可以(Two-Two=new-One();)
为了从One
中获得Two
,您必须创建一个新的Two
。您可以使用一个方法将One
的所有成员复制到Two
,或者可以使用Two
的构造函数,该构造函数接受One
并从中设置属性。简言之:是
正如前面所说,一个不是从两个继承的,因此这里没有“逻辑”默认操作。
你应该调查一下。这将允许您在定义运算符后仍然使用two=(two)one语法,如(在类def中)所示:
简言之:是的
正如前面所说,一个不是从两个继承的,因此这里没有“逻辑”默认操作。
你应该调查一下。这将允许您在定义运算符后仍然使用two=(two)one语法,如(在类def中)所示:
是的,您必须实现将
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
的所有成员复制到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);
重要的是要记住,1和2只是内存中指向对象实例的指针 如果我们用通俗易懂的英语写出来,它会是这样的:
One one = new One();
在内存中创建引用的指针
指向类型为One
的对象,并为其添加标签
one,然后创建类型为one
并将其放置在内存位置
由一个指示
替换由two引用的对象
对象由one引用,并且
把它当作一个物体对待
类型2
除了明显的键入问题外,这只会替换内存中引用的对象,而不会将值从一个复制到另一个