繁体   English   中英

C#继承(入门)

[英]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 {
}

这两个有什么共同点?

  1. 他们有四只脚;
  2. 他们都是动物。
  3. 他们有头发。

他们没有什么共同点?

  1. 猫叫声;猫叫声
  2. 狗叫;

让我们通过设置顺序来修改我们的模型。

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 因此,无论CatDog是动物。

我们可以说不是每个动物都有四条腿,有些没有任何一条,而其他只有两条,这可以进一步推动我们的例子。 然后,我们将不得不概括和专门化。

简而言之:是的

就像已经说过的那样,“一个”不继承自“两个”,因此这里没有“逻辑”默认操作。 您应该研究转换运算符 这将使您在定义运算符后仍使用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 您可以有一个将“ OneTwo所有成员复制的方法,也可以有一个为“ Two的构造器,该构造器采用“一One并从此处设置属性。

是的,你必须实现的方法是复制的所有成员onetwo 通常,您将创建一个构造函数:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM