C#中如何调用父类非抽象方法

bruceangel 2014-05-03 06:51:11
问题:
动物Animal都有吃Eat和叫Bark的方法,狗Dog和猫Cat叫的方法不一样.父类中没有默认的实现所以考虑用抽象方法。

用C#语言抽象方法实现:
Animal父类:(abstract)
abstract Bark()方法
Eat()方法
Dog子类
override Bark()方法
Cat子类
override Bark()方法
Factory工厂
static Animal CreteFunction()
return new Dog();
return new Cat();
主程序:
Animal animal=Factory.CreteFunction();
animal.Bark();

如何调用父类中非抽象方法?
想确认下,是每个子类直接调用父类的Eat()方法吧!
...全文
333 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bruceangel 2014-05-03
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
有些人滥用继承,写出了诡异的、让程序约来越乱的代码。例如他想省得写点程序逻辑,于是就滥用继承。 使用里氏替换原则,你就能够测试出那些滥用继承的人写的程序是多么龌龊,因为它的代码继承不是跟业务领域的意义保持一致的,让程序背后的业务逻辑变得诡异和混乱不堪。 因此这个原则,是软件工程原则。而刚学编程的人是不可能对这种精炼的原则理解得比较多的。
#4楼的大哥解析的很到位,这里面确实需要多练习,多理解,我还想请教一下: 由于子类都有共同的特征“吃”,而父类用的是抽象类实现的,特征是父类的抽象方法,子类必须都重写,所以为了不让每个子类都重复写这个方法,所以就将其子类共有的特征“吃”方法,以非抽象方法的形式放在父类中,然后子类直接继承调用即可; 我想请教的是这样的逻辑是否对,或者就这个例子而言有没有更好的方式,也或者我写的这个方式是否有优化之处; 由于刚学习编程不久,还请多多耐心指导,谢谢!
bruceangel 2014-05-03
  • 打赏
  • 举报
回复
#4楼的大哥解析的很到位,这里面确实需要多练习,多理解,我还想请教一下: 由于子类都有共同的特征“吃”,而父类用的是抽象类实现的,特征是父类的抽象方法,子类必须都重写,所以为了不让每个子类都重复写这个方法,所以就将其子类共有的特征“吃”方法,以非抽象方法的形式放在父类中,然后子类直接继承调用即可; 我想请教的是这样的逻辑是否对,或者就这个例子而言有没有更好的方式,也或者我写的这个方式是否有优化之处; 由于刚学习编程不久,还请多多耐心指导,谢谢!
  • 打赏
  • 举报
回复
有些人滥用继承,写出了诡异的、让程序约来越乱的代码。例如他想省得写点程序逻辑,于是就滥用继承。 使用里氏替换原则,你就能够测试出那些滥用继承的人写的程序是多么龌龊,因为它的代码继承不是跟业务领域的意义保持一致的,让程序背后的业务逻辑变得诡异和混乱不堪。 因此这个原则,是软件工程原则。而刚学编程的人是不可能对这种精炼的原则理解得比较多的。
  • 打赏
  • 举报
回复
1. 子类继承了父类,也就继承了父类的方法。除非你重写此方法,否则子类的Eat也就是父类的Eat。 但是关键地是,就算是你认为此代码定义在父类的Eat中,它运行时的对象(this)也是子类对象。例如一只猫,你调用它的Eat方法,代码在Animal中定义Eat方法,但是运行时如果你写
    abstract class Animal
     {
         //吃
        public void Eat()
         {
             Console.WriteLine("{0}需要吃食物!", this.GetType().Name);
         }

......
你肯定会得到“Cat需要吃食物”的答案,而不是“Aniamal需要吃食物”! 不是说一只Cat身体里另外住着一个Animal,而是“一个Cat同时也就是一个Animal”。而OOP实现了这个功能。因此你调用 animal.Eat() 其实就是针对 Animal 的子类对象实例进行的 Eat 操作。因为子类对象继承了 Eat 操作。 2. 里氏替换原则是一个实践性原则,不是一个标题党。 它是说,当你设计程序的时候,如果你的程序让一个类型B继承自类型A,那么你就应该尽量让所有B类实例都能通过针对A类对象实例所写的测试。 这是一个实践性原则,是用来鉴别你有没有“滥用继承”的。这需要比较多的、令人信服的测试用例。而且不是用手工测试方式,而是用可执行的代码方式来进行自动化测试。 不是说你随便写一个继承子类对象的赋值语句,就说成是里氏替换原则的表现。
bruceangel 2014-05-03
  • 打赏
  • 举报
回复
//抽象类实现 abstract class Animal { public Animal() { } //吃 public void Eat() { Console.WriteLine("动物需要吃食物!"); } //叫 public abstract void Bark(); } //猫 class Cat:Animal { public override void Bark() { Console.WriteLine("猫的叫声是:喵喵喵喵喵喵……"); } } //狗 class Dog:Animal { public override void Bark() { Console.WriteLine("狗的叫声是:汪汪汪汪汪汪……"); } } //工厂 class Factory { public static Animal CreateFunction(string type) { switch (type) { case "1": return new Dog(); case "2": return new Cat(); default: return null; } } } //控制台主程序 static void Main(string[] args) { while (true) { Console.WriteLine("查看不同动物的特性,请选择:"); Console.WriteLine("1、狗 2、猫"); string value = Console.ReadLine(); Animal animal = Factory.CreateFunction(value); if (value == "1" || value == "2") { animal.Eat();//? animal.Bark(); Console.WriteLine(); continue; } Console.WriteLine("系统找不到指定的动物……\r\n"); } } 我的疑问是1: 主程序中想调用父类的Eat()方法有以下两种: Animal animal = Factory.CreateFunction(value); 1、animal.Eat();这种方式怎么解释?是用的base.方法名实现的吗? 2、Animal dogAnimal = new Dog(); dogAnimal.Eat();这种方式是里氏转换原则实现的
threenewbee 2014-05-03
  • 打赏
  • 举报
回复
base.方法名
zhouxiulu 2014-05-03
  • 打赏
  • 举报
回复
请看完里氏代换

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧