110,499
社区成员
发帖
与我相关
我的任务
分享
class Person
{
public virtual void printType(){}
public string beType { set; get; }
}
class Student:Person
{
public override void printType()
{
MessageBox.Show(beType);
}
}
private void button1_Click(object sender, EventArgs e)
{
Person pre = new Student() { beType = "the student" };
pre.printType();
}
Person pre = new Student() { beType = "the student" };
在堆上开辟了块空间,pre保存了该空间的首地址
2)里氏转换原则,讲得是结构设计原则,和你的问题无关。大意是:父类工作的地方,可以用其子类替代之。本质是说子类没有改变父类的功能,反过来是说子类只能在父类基础上“新增”功能,而不可以改动父类原有功能,保证开闭原则。应该讲得很明白了。
用在软件结构设计方面
3)和Person pre = new Student() { beType = "the student" };一样
里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。
里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。
LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,
基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
if(Add)
{
return a+b;
}
else if(Substraction)
{
return a-b;
}
现在要增加a*b的算法,是不是要再加一个else if(Multiplacation),也就是改动了原来的代码
可以这样,
//基类和接口不动,无需修改
class Operation
{
public int Number_one { set; get; }
public int Number_two { set; get; }
}
interface add_Interface
{
int add();
}
//加法运算过来,直接继承上面不动的两个东西,并将运算封装到一个类中
class Add:Operation,add_Interface
{
//some functions...............
public int add()
{
return Number_one - Number_two;
}
}
//其他运算过来,增加运算的新类就可以了,无需动基类和接口
//调用
Add add = new Add();
add.Number_one = 1000;
add.Number_two = 100;
MessageBox.Show(add.add().ToString());
我这个,连个工厂模式都不是,但似乎可以解决问题,当然现实中还要考虑很多。
临时想了这个思路,可能不好,欢迎大牛指正
本质是说子类没有改变父类的功能 = 我们只是把子类的对象装在了父类里面,所以没有改变父类的功能
反过来是说子类只能在父类基础上“新增”功能,而不可以改动父类原有功能,保证开闭原则 = 我们可以在子类上写属性,或者方法,这样就达到了“新增功能”的目的
这两句我这样么解释正确吗?
但是这一句我并不是很懂:保证开闭原则。[/quote]
不是你那么理解的!
给你具体例子,你就可以理解了
class A
{
public void method1()
{
MessageBox.Show("The method is in basic class");
}
}
class B : A
{
public void method2()
{
MessageBox.Show("The method is in inherited class");
}
}
private void button1_Click(object sender, EventArgs e)
{
A a1 = new A();
a1.method1();
A a2 = new B(); //子类B可以替代父类A工作
a2.method1();
}
输出结果一样
而我上面写的例子(override),不满足里氏转换原则。我只是看见你说没法取到子类内容。
不过现实中,用override的例子不少