C#继承(初学者)

时间:2010-11-18 20:31:52

标签: c# inheritance

对于我认为的大部分内容,我有一些容易回答的问题:

我有以下课程:

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

那么我真的必须实现一个方法来复制一到两个所有成员吗?

5 个答案:

答案 0 :(得分:2)

One不会继承Two,这就是效果不佳。

类继承并不意味着隐藏或替换一个类的属性值,而是派生类是它继承的基类的特化。

例如:

public class Cat {
}

public class Dog {
}

这两者有什么共同之处?

  1. 他们有四条腿;
  2. 他们都是动物;
  3. 他们有头发;
  4. 他们没有什么共同点?

    1. 一只猫喵喵叫;
    2. 狗吠;
    3. 让我们按顺序设置修改我们的模型。

      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将“发出声音”,而不是“喵喵叫”,因为通过类型转换CatAnimal,你说你想要与任何Animal合作,只要它是一个。因此,CatDog都是动物。

      我们可以进一步推动我们的榜样,说不是每只动物都有四条腿,有些没有,有些只有两只。然后,我们必须相应地进行概括和专门化。

答案 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

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

相关问题