解决方案 »
- C# 生成Excel文件后,为何进程里有很多Excel.exe进程
- 发错版块了,此贴50分啊
- Asp.net 管理系统 调用Discuz论坛,如何自动登录
- Excel导入datatable,再导入数据库,导入数据库时还要判断,有些记录是数据库已经有的不能导入,谁做过?有代码最好
- 我的winform程序打开后,再点击应用程序图标,会又打开一个。
- 水晶报表显示图片类型的字段
- 按下Esc键后关闭程序的代码该怎么写?我的错了吗?
- 分页打印的问题:PrintPageEventArgs.HasMorePages = true,在什么地方设置和合适。
- 分享SignalR+Chart.js+TypeScript整合开发CPU使用率实时图表
- 很简单的问题,但是很急,解决了就给分!!
- winform程序在xp下运行出现异常
- 找不到方法:“System.Reflection.MethodInfo System.Reflection.PropertyInfo.get_GetMethod
class3 cl = new class1();
class3 c2 = new class2();
??
如果类型 A 和 B 分别继承自类型 C,面向对象最基本的原则之一就是“A和B的实例一定要能够放到所有关于C的测试中运行”。例如你把“鸭嘴兽和鸡”设计为“禽类”,那么必须保证鸭嘴兽必须“是”禽类,并且“鸡”也必须是禽类。那种为了编程“方便”而胡乱滥用继承,是错误的做法。讲不出面向业务领域的抽象含义而就胡乱“融合”是会搞错代码的,遇到这种(任意滥用继承的)bug时你的技术经理会直接让你下岗的,因为一眼就能看出程序经不起面向对象基本测试。
public class A
{
public void write()
{
Console.WriteLine("this is Class A");
} }
public class B
{
public void write()
{
Console.WriteLine("this is Class B");
}
}
public class C
{
public C()
{
this.a = new A();
this.b = new B();
}
public A a { get; set; }
public B b { get; set; }
public void write()
{
Console.WriteLine("this is Class C");
}
}
static void Main(string[] args)
{ C c1 =new C();
c1.write();
c1.a.write();
c1.b.write();
Console.ReadKey();
}
class3(class1,class2)//构造函数来组合getClass1//用属性来拆分
getClass2
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
TrapeziaArea myclass = new TrapeziaArea();//实例化类对象
myclass.SD = Convert.ToDouble(textBox1.Text);//为梯形的上底赋值
myclass.XD = Convert.ToDouble(textBox2.Text);//为梯形的下底赋值
myclass.Height = Convert.ToDouble(textBox3.Text);//为梯形的高赋值
textBox4.Text = myclass.Area().ToString();//计算梯形面积
}
} class Trapezia//自定义类
{
private double sd = 0;//定义int型变量,作为梯形的上底
private double xd = 0;//定义int型变量,作为梯形的下底
private double height = 0;//定义int型变量,作为梯形的高
// 上底
public double SD
{
get
{
return sd;
}
set
{
sd = value;
}
}
// 下底
public double XD
{
get
{
return xd;
}
set
{
xd = value;
}
}
// 高
public double Height
{
get
{
return height;
}
set
{
height = value;
}
}
}
// 自定义类,该类继承自Trapezia
class TrapeziaArea : Trapezia
{
// 求梯形的面积
// <returns>梯形的面积</returns>
public double Area()
{
return (SD + XD) * Height / 2;
}
}
对于class1和class2, 可理解为动态数据模型和配置数据模型,
我做过一个简单测试, class1为普通类或者抽象类,Iclass2为接口, class3同时继承class1和Iclass2, 声明一个class3的时候, 把class3的对象转化城class1,或者Iclass2的对象,其实是内部属性的隐藏, 本质上, 这个对象还是class3的对象. class Program
{
static void Main(string[] args)
{ Info i = new Info() { ID=1 ,Name="loui"}; MongoData md = (MongoData)i; /*这里的md数据,虽说数据类型上以转成MongoData, 其实他是个Info类型的, 只是对md 对象隐藏了Config 的属性.
当我把md这个对象序列化存储到mongodb时, 其实我只想存MongoData 的数据结构体,而这时候储存的其实是Info的数据 结构体
*/
}
} class MongoData
{
public string Name { get; set; }
}
interface Config
{
int ID { get; set; }
}
class Info : MongoData, Config
{
public int ID { get; set; }
}不知我这次的描述是否详细.