对于我认为的大部分内容,我有一些容易回答的问题:
我有以下课程:
class One
{
string first;
}
class Two : One
{
string second;
}
现在我想要替换Two值的所有One值。所以我尝试了以下内容:
One one = new One();
Two two = new Two();
two = (Two) one; // <= this seems to not work
那么我真的必须实现一个方法来复制一到两个所有成员吗?
答案 0 :(得分:2)
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
合作,只要它是一个。因此,Cat
和Dog
都是动物。
我们可以进一步推动我们的榜样,说不是每只动物都有四条腿,有些没有,有些只有两只。然后,我们必须相应地进行概括和专门化。
答案 1 :(得分:1)
简而言之:是的
就像已经说过的那样,One不会从Two继承,所以这里没有“逻辑”默认动作。 你应该研究Conversion Operators。这将让你在定义一个运算符之后仍然使用两个=(两个)一个语法,就像这样(在类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;
}
答案 2 :(得分:0)
您无法将One
转换为Two
,因为One
不会从Two
继承。反过来可以正常工作(Two two = new One();
)
要从Two
获得One
,您必须创建新的Two
。您可以使用一种方法将One
的所有成员复制到Two
,或者您可以拥有Two
的构造函数,该构造函数需要One
并从那里设置属性。
答案 3 :(得分:0)
是的,您必须实施一种方法,将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);
答案 4 :(得分:0)
重要的是要记住,一个和两个只是内存中指向对象实例的指针。
如果我们用简单的英语写出来,它会读到这样的内容:
One one = new One();
在引用的内存中创建一个指针 到
One
类型的对象并标记它 一个,然后创建One
类型的对象 并将其放在内存位置 用一个表示。
two = (Two) one;
替换两个引用的对象 使用一个引用的对象,和 把它看作是一个对象 类型
Two
除了明显的输入问题之外,这只会替换内存中引用的对象,而不是将值从一个复制到另一个。