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

    除了明显的键入问题外,这只会替换内存中引用的对象,而不会将值从一个复制到另一个