3个C#中接口的多态性的问题。

图片说明
图片说明
图片说明
图1是关于接口多态性的讲述。有点看天书的感觉
图2是课后习题,习题4和5是关联的。其中题目5:“接受两个杯子对象中的任意一个”怎么理解?
图3是习题答案,其中参数列表中的HotDrink drink为什么是杯子对象?如果“Hotdrink drink”是两个杯子对象中的任意一个,按照题5中要求的“接受两个杯子对象中的任意一个”,那么另一个杯子对象是什么?(这个问题确实没水平,我还没get到C#的点)
另外,书中说“HotDrink drink不支持ICup 接口,但我们知道传
送给这个函数的两个cup 对象支持ICup 接口”
为什么我感觉它说的“传送给函数的两个cup对象”是HotDrink的两个派生类Cow和Chicken呢?(根据题目4的答案猜的)但是“传送给函数的两个cup对象(答案中表现为HotDrink drink)”和“派生类Cow、Chicken”有什么关系呢?HotDrink drink不是基类HotDrink的实例吗?而Cow、Chicken不是基类HotdDrink的派生类吗?这两个沾边吗?

9个回答

 这书编写的看似深入浅出,但是其实一点用没有,我们要知道,编程语言是一种工具,目的是为了更好地编写软件,而不是徒增概念去模拟现实世界。

那么接口有什么用呢?

比如说,我们要写一个通用的排序算法,注意通用两个字。比如说,我们的排序算法既要能对Room对象(给出房子长宽)的面积排序,也要能对Student对象(给出学生的姓名)按照名字排序。
或者还是这个Student对象,我们按照成绩排序。
我们发现,问题的关键在于,排序的依据每次都是不同的,不能写死在排序算法里,否则,这个排序算法通用不起来了。

那怎么办呢,我们可以用接口。定义一个IComparer接口(实际上这个接口.net已经有了),这个接口有Compare方法。
我们可以写出如下排序代码(比如最简单的,冒泡排序)
void sort(object[] arr, IComparer c)
{
for (int i = 0; i < arr.Count -1; i++)
for (int j = 1; j < arr.Count; j++)
{
if (c.Compare(arr[j] , arr[j - 1]) < 0)
{ object t = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = t; }
}
}
注意看这个代码,我们调用接口去比较两个对象,而不是直接比较,那么比较的逻辑就独立于排序算法了。

因此我们要排序学生的名字,我们只要传入一个实现了比较学生名字的比较对象,就可以了。
class MyComparer : IComparer
{
public int Compare(object a, object b)
{
return (Student)a.Name.Compare((Student)b.Name);
}
}
然后
object[] arr = { stu1, stu2, stu3 };
sort(arr, new MyComparer());
如果要按照年纪排序呢,我们再定义一个类,或者修改上面的代码,用
return (Student)a.Age - (Student)b.Age;

而sort的代码,是不是就不用修改了?
devmiao
见了你女王大人喵姐还不跪下 我也觉得很详细。
一年多之前 回复
caozhy
贵阳老马马善福专门编写代码的老马就是我! 回复showbo: 嘿嘿
一年多之前 回复
showbo
支付宝加好友偷能量挖 O(∩_∩)O哈哈~,够详细。。
一年多之前 回复

按照你的红框里的代码
sort里不通过接口c,而是直接用具体的类型调用sort

void sort(object[] arr, MyComparer c) //这里不用接口
{
for (int i = 0; i < arr.Count -1; i++)
for (int j = 1; j < arr.Count; j++)
{
if (c.Compare(arr[j] , arr[j - 1]) < 0)
{ object t = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = t; }
}
}

这代码就不通用了,为什么呢,因为显然要先编写出MyComparer,才能编写sort代码,
sort代码是一个通用的(比如放在系统库里的),可以直接拿来用的函数,那么它显然是先写好的,显然是不能反过来依赖你调用者写好MyComparer它才能用。或者说不能每次排序依据修改了,就把sort重新写一次,这个能理解吧。

下面再看你的杯子任意一个

我还是接着上面说,我再写一个年龄排序的
class MyAgeComparer : IComparer
{
public int Compare(object a, object b)
{
return (Student)a.Age - (Student)b.Age;
}
}
加上前面的
class MyComparer : IComparer
{
public int Compare(object a, object b)
{
return (Student)a.Name.Compare((Student)b.Name);
}
}
是不是有两个实现了IComparer的类(MyComparer和MyAgeComparer)

那么显然,sort可以接受任何一个,而且你传哪个,就按照哪个定义的排序规则排序。
比如
object[] arr = { stu1, stu2, stu3 };
sort(arr, new MyComparer());
此时arr按照名字排序
sort(arr, new MyAgeComparer());
此时arr按照年纪排序

下面那个问题不用回答了吧,两个选一个,两个不需要同时存在。好比
sort(arr, new MyAgeComparer());
就行了,不关MyComparer的事

反正你不用管什么cup、drink了,你需要明白的看我这个例子
sort是一个通用的,系统预置的函数
IComparer也是系统预置好的

而MyComparer、MyAgeComparer...等等是你作为调用者现写的类
并且将它作为参数传给sort,sort调用了其中Compare方法,实现了某个逻辑的自定义。(而整体算法可以重用)

whyyouhitme_
whyyouhitme_ 明白了!谢谢!很详细!我大概也猜到书中想表达这个思想。但是它并没有明确的给出观点,和详细的论据!
一年多之前 回复

多态性(C# 编程指南)转自MSDN
通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性。C# 中的每种类型都是多态的。类型可用作它们自己的类型或用作 Object 实例,因为任何类型都自动将 Object 当作基类型。

多态性不仅对派生类很重要,对基类也很重要。任何情况下,使用基类实际上都可能是在使用已强制转换为基类类型的派生类对象。基类的设计者可以预测到其基类中可能会在派生类中发生更改的方面。例如,表示汽车的基类可能包含这样的行为:当考虑的汽车为小型货车或敞篷汽车时,这些行为将会改变。基类可以将这些类成员标记为虚拟的,从而允许表示敞篷汽车和小型货车的派生类重写该行为。

多态性概述
当派生类从基类继承时,它会获得基类的所有方法、字段、属性和事件。面向对象的语言使用虚方法表达多态。若要更改基类的数据和行为,您有两种选择:可以使用新的派生成员替换基成员,或者可以重写虚拟的基成员。

使用新的派生成员替换基类的成员需要使用 new 关键字。如果基类定义了一个方法、字段或属性,则 new 关键字用于在派生类中创建该方法、字段或属性的新定义。new 关键字放置在要替换的类成员的返回类型之前。例如:

1public class BaseClass

2{

3 public void DoWork() { }

4 public int WorkField;

5 public int WorkProperty

6 {

7 get { return 0; }

8 }

9}

10public class DerivedClass : BaseClass

11{

12 public new void DoWork() { }

13 public new int WorkField;

14 public new int WorkProperty

15 {

16 get { return 0; }

17 }

18}

19

使用 new 关键字时,调用的是新的类成员而不是已被替换的基类成员。这些基类成员称为隐藏成员。如果将派生类的实例强制转换为基类的实例,就仍然可以调用隐藏类成员。例如:

DerivedClass B = new DerivedClass();
B.DoWork(); // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork(); // Calls the old method.
为了使派生类的实例完全接替来自基类的类成员,基类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加 virtual 关键字来实现的。然后,派生类可以选择使用 override 关键字而不是 new,将基类实现替换为它自己的实现。例如:

public class BaseClass
{
public virtual void DoWork() { }

public virtual int WorkProperty
{
get { return 0; }
}
}
public class DerivedClass : BaseClass
{
public override void DoWork() { }
public override int WorkProperty
{
get { return 0; }
}
}
字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的。当派生类重写某个虚拟成员时,即使该派生类的实例被当作基类的实例访问,也会调用该成员。例如:

DerivedClass B = new DerivedClass();
B.DoWork(); // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork(); // Also calls the new method.
使用虚拟方法和属性可以预先计划未来的扩展。由于在调用虚拟成员时不考虑调用方正在使用的类型,所以派生类可以选择完全更改基类的外观行为。

无论在派生类和最初声明虚拟成员的类之间已声明了多少个类,虚拟成员都将永远为虚拟成员。如果类 A 声明了一个虚拟成员,类 B 从 A 派生,类 C 从类 B 派生,则类 C 继承该虚拟成员,并且可以选择重写它,而不管类 B 是否为该成员声明了重写。例如:

public class A
{
public virtual void DoWork() { }
}
public class B : A
{
public override void DoWork() { }
}
public class C : B
{
public override void DoWork() { }
}
派生类可以通过将重写声明为密封的来停止虚拟继承。这需要在类成员声明中将 sealed 关键字放在 override 关键字的前面。例如:

public class C : B
{
public sealed override void DoWork() { }
}
在上面的示例中,方法 DoWork 对从 C 派生的任何类都不再是虚拟的。它对 C 的实例仍然是虚拟的 -- 即使将这些实例强制转换为类型 B 或类型 A。派生类可以通过使用 new 关键字替换密封的方法,如下面的示例所示:

public class D : C
{
public new void DoWork() { }
}
在此情况下,如果在 D 中使用类型为 D 的变量调用 DoWork,被调用的将是新的 DoWork。如果使用类型为 C、B 或 A 的变量访问 D 的实例,对 DoWork 的调用将遵循虚拟继承的规则,即把这些调用传送到类 C 的 DoWork 实现。

已替换或重写某个方法或属性的派生类仍然可以使用基关键字访问基类的该方法或属性。例如:

public class A
{
public virtual void DoWork() { }
}
public class B : A
{
public override void DoWork() { }
}
public class C : B
{
public override void DoWork()
{
// Call DoWork on B to get B's behavior:
base.DoWork();

    // DoWork behavior specific to C goes here:
    // ...
}

}

注意
建议虚拟成员在它们自己的实现中使用 base 来调用该成员的基类实现。允许基类行为发生使得派生类能够集中精力实现特定于派生类的行为。未调用基类实现时,由派生类负责使它们的行为与基类的行为兼容。

C# 多态性
多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。

多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。

静态多态性
在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为:

函数重载
运算符重载
运算符重载将在下一章节讨论,接下来我们将讨论函数重载。

函数重载
您可以在同一个范围内对相同的函数名有多个定义。函数的定义必须彼此不同,可以是参数列表中的参数类型不同,也可以是参数个数不同。不能重载只有返回类型不同的函数声明。

下面的实例演示了几个相同的函数 print(),用于打印不同的数据类型:

using System;
namespace PolymorphismApplication
{
class Printdata
{
void print(int i)
{
Console.WriteLine("Printing int: {0}", i );
}

  void print(double f)
  {
     Console.WriteLine("Printing float: {0}" , f);
  }

  void print(string s)
  {
     Console.WriteLine("Printing string: {0}", s);
  }
  static void Main(string[] args)
  {
     Printdata p = new Printdata();
     // 调用 print 来打印整数
     p.print(5);
     // 调用 print 来打印浮点数
     p.print(500.263);
     // 调用 print 来打印字符串
     p.print("Hello C++");
     Console.ReadKey();
  }

}
}
当上面的代码被编译和执行时,它会产生下列结果:

Printing int: 5
Printing float: 500.263
Printing string: Hello C++
动态多态性
C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。

请注意,下面是有关抽象类的一些规则:

您不能创建一个抽象类的实例。
您不能在一个抽象类外部声明一个抽象方法。
通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。
下面的程序演示了一个抽象类:

using System;
namespace PolymorphismApplication
{
abstract class Shape
{
public abstract int area();
}
class Rectangle: Shape
{
private int length;
private int width;
public Rectangle( int a=0, int b=0)
{
length = a;
width = b;
}
public override int area ()
{
Console.WriteLine("Rectangle 类的面积:");
return (width * length);
}
}

class RectangleTester
{
static void Main(string[] args)
{
Rectangle r = new Rectangle(10, 7);
double a = r.area();
Console.WriteLine("面积: {0}",a);
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:

Rectangle 类的面积:
面积: 70
当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法。虚方法是使用关键字 virtual 声明的。虚方法可以在不同的继承类中有不同的实现。对虚方法的调用是在运行时发生的。

动态多态性是通过 抽象类 和 虚方法 实现的。

下面的程序演示了这点:

using System;
namespace PolymorphismApplication
{
class Shape
{
protected int width, height;
public Shape( int a=0, int b=0)
{
width = a;
height = b;
}
public virtual int area()
{
Console.WriteLine("父类的面积:");
return 0;
}
}
class Rectangle: Shape
{
public Rectangle( int a=0, int b=0): base(a, b)
{

  }
  public override int area ()
  {
     Console.WriteLine("Rectangle 类的面积:");
     return (width * height); 
  }

}
class Triangle: Shape
{
public Triangle(int a = 0, int b = 0): base(a, b)
{

  }
  public override int area()
  {
     Console.WriteLine("Triangle 类的面积:");
     return (width * height / 2); 
  }

}
class Caller
{
public void CallArea(Shape sh)
{
int a;
a = sh.area();
Console.WriteLine("面积: {0}", a);
}
}

class Tester
{

  static void Main(string[] args)
  {
     Caller c = new Caller();
     Rectangle r = new Rectangle(10, 7);
     Triangle t = new Triangle(10, 5);
     c.CallArea(r);
     c.CallArea(t);
     Console.ReadKey();
  }

}
}
当上面的代码被编译和执行时,它会产生下列结果:

Rectangle 类的面积:
面积:70
Triangle 类的面积:
面积:25

通过继承实现的不同对象调用相同的方法,表现出不同的行为,称之为多态
代码

public class Animal
{
public virtual void Eat()
{
Console.WriteLine("Animal eat");
}
}

public class Cat : Animal
{
    public override void Eat()
    {
        Console.WriteLine("Cat eat");
    }
}

public class Dog : Animal
{
    public override void Eat()
    {
        Console.WriteLine("Dog eat");
    }
}

class Tester
{
    static void Main(string[] args)
    {
        Animal[] animals = new Animal[3];

        animals[0] = new Animal();
        animals[1] = new Cat();
        animals[2] = new Dog();

        for (int i = 0; i < 3; i++)
        {
            animals[i].Eat();
        }
    }
}

复制代码

 输出如下:

Animal eat...

Cat eat...

Dog eat...

在上面的例子中,通过继承,使得Animal对象数组中的不同的对象,在调用Eat()方法时,表现出了不同的行为。

多态的实现看起来很简单,要完全理解及灵活的运用c#的多态机制,也不是一件容易的事,有很多需要注意的地方。

问题里根本没有比较接口的事,不明白怎么答题大谈比较接口。套用一个词,“差评!”
解答:
1. 你的理解没问题,书上那么写只是表示可以向上转型,估计是加深下印象对象也同时是改接口对象;
2. 就是说HotDrink两个子类中的某一种子类都可以;
3. 所以没有另一个杯子之说,2指的是class中的某一种;
4. HotDrink和ICup是两个不相关的接口,就是说不能显式的转为HotDrink类型后调用ICup接口。对象实现两个接口不等于认为HotDrink对象可以调用ICup接口;
5. 最后一句书里没那个说法,只是说HotDrink类型和ICup类型吧。

feelcycle_07
默默悟问 回复devmiao: 谁欺负谁嘛,我一个人可挡不住好几个人踩我。我也说了,以直报怨而已。以后别理我,我也懒得理。
一年多之前 回复
devmiao
见了你女王大人喵姐还不跪下 给你点个踩,回答问题你就老老实实回答好了,干嘛要贬低别人。之前是恶意贬损bobo,这次又欺负cao大。根据csdn的规则,再来一次的话,就请管理员把你丢出去。
一年多之前 回复
feelcycle_07
默默悟问 截图为证。
一年多之前 回复
feelcycle_07
默默悟问 最近我就跟问答总榜的前几名直接或间接争执过,敢说和你们无关吗?请收敛点,否则我不介意到处贴贴这几次争执,看看谁在意,不在意自己的风评吗?
一年多之前 回复
feelcycle_07
默默悟问 又4个差评,其他都没有,是针对我了?搞些小动作算什么,算得上是“鼠辈”了吧。
一年多之前 回复
feelcycle_07
默默悟问 没忍住,“以直报怨”了。没道理我的回答被指责,而且答案还雷同一写,我看到不怎么靠谱的答案还不能再答复吧。
一年多之前 回复
feelcycle_07
默默悟问 改为-估计是加深下印象对象也同时是该接口对象
一年多之前 回复
feelcycle_07
默默悟问 1里是也同时是改接口对象
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java实验3 类的多态性和接口
实验3 类的多态性和接口一、实验目的理解面向对象的多态性。理解接口和实现接口的类的关系,掌握一个类实现多个接口的声明和使用方法。二、实验内容1.程序理解:1)接口的应用//接口的应用 //定义一个PCI接口: interface PCI { void start(); // 定义抽象方法start() void stop(); // 定义抽象方法stop() }// 定义 Networ
C#中多态性的理解
在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。 多态性可以是静态的或动态的。 在静态多态性中,函数的响应是在编译时发生的。 函数重载 运算符重载 在动态多态性中,函数的响应是在运行时发生的。 参考资料:http://www.runoob.com/csharp/csharp-polymorphism.html
浅谈C#中的多态性
首先理解一下什么叫多态。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。 多态性通过派生类覆写基类中的虚函数型方法来实现。   多态性分为两种,一种是编译时的多态性,一种是运行时的多态性。 编译时的多态性:编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。 运行时的多态性:运行时的多态性就是...
c# 关于多态性的问题
[code=C#]using System;rnrnnamespace 多态性_1rnrn public class Personrn rn private string name = "张三"; rn private int age = 26;rn public Person(string Name, int Age)rn rn name = Name; rn age = Age;rn rn protected virtual void Display()rn rn Console.WriteLine("姓名:0,年龄:1", name, age);rn rn static public void DisplayData(Person aPerson) rn rn aPerson.Display();rn rn rn public class Employee:Personrn rn private string department;rn private decimal salary;rn public Employee(string Name, int Age, string D, decimal S):base(Name, Age)rn rn department = D;rn salary = S;rn rn protected override void Display() rn rn base.Display(); rn Console.WriteLine("部门:0,薪金:1", department , salary );rn rn rn class Testrn rn static void Main(string[] args)rn rn Person OnePerson = new Person("李四", 40);rn Person.DisplayData(OnePerson); rn Employee OneEmployee = new Employee ("王五", 23, "客服部", 5000);rn Person .DisplayData(OneEmployee);rn Console.Read();rn rn rnrn[/code]rn运行的结果是rn[b]姓名:李四,年龄:40rn姓名:王五,年龄:23rn部门:客服部,薪金:5000[/b]rn为什么在Main()主函数中[color=#FF0000]Person.DisplayData(OneEmployee);[/color]这句语句输出的是派生类重写后的输出的语句呢?rn这里DisplayData是基类的静态方法!其中执行的语句是aPerson.Display();怎么这个Display却成了派生类重写后的内容了呢?rn[color=#FF0000]是不是只要派生类,做了实例化后,基类中的虚方法就被重写了[/color],不然的话在上面的代码中,并没有用派生类的对象去调用重写的Display方法啊,怎么结果会成为这样呢?
c#多态性 与 C++多态性 的区别
昨天突然发现c#,和c++俩种语言在多态性的 实现机制 上面的细微差别。rn rn如果是C++,在基类的构造函数里面调用虚函数的话,会调用本类的不会调用派生类的,原因是基类构造的时候,虚表还没有被派生类继承和修改。rnrn 但如果是C#,那就不同了,在基类的构造函数里面照样调用派生类的。不知道有谁知道c#它的这种底层机制是怎样的?
c#的多态性
哪位大哥能透彻的讲讲c#的多态性。现在对多态性的概念很模糊。rn1、基类不使用virtual,在派生类中直接重写一个与基类的函数同名的函数rn2、在基类中使用virtual,在派生类中用override重写rn3、使用new关键字重写。rn以上三种有什么区别?rn看了几本书都讲得模模糊糊。所以在调用的时候将派生类对象赋给基类对象以及将基类对象赋给派生类对象,调用成员函数时到底是调基类的还是派生类的也搞不大清楚。
C# 多态性
多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。 多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。 静态多态性 在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为: 函数重载 运算符重载 运算符重
C# 多态性
多态性是指对象可以表示多个类型的能力。在C#中,多态性的定义是:同一操作,作用于不同的类的实例。不同的类将会执行不同的解释,最后产生不同的结果。简答的理解就是方法名一样,参数类型不一样。        实现多态性的方式有以下几种:        1,通过继承实现多态性:        2,通过抽象类实现多态性:        3,通过接口实现多态性:  以下的例子就是重写基类的方
c#多态性
编译时的多态性是通过重载来实现的,那它仅仅说的是非虚成员吧?因为虚成员用的是运行时的多态性哦,概念对吗?
Java 的多态性、抽象类与接口
Java的多态性就是体现在‘向上转型(父类指向子类的引用)’、‘继承’、‘重写’ 三个操作上,利用多态可以使得程序具有良好的扩展性,并可以对所有类对象进行通用处理。下面我们看具体实例: 1、我先定义了一个动物类: //定义了动物类,动物可以做一些事 public abstract class Animal { public void doSomething(){ ...
Java 抽象类、接口、多态性
父类变量引用子类对象 我们知道C++中用父类的指针和引用指向子类对象,从而实现多态,但是Java中没有指针,引用也和C++不同。 Java中的父类变量引用子类对象格式:Base b = new Derived(参数表) 例如:Shape C1 = new Circle(5); 抽象类和抽象函数 抽象类的定义方法是在class前加关键字abstract,抽象函数是在返回值前加关键字abstra...
C#多态性
请问C#中的多态性是什么意思.就高手们指教哦.谢过
java的多态性及接口
1、程序理解 //接口的应用 //定义一个PCI接口: interface PCI { void start(); // 定义抽象方法start() void stop(); // 定义抽象方法stop() } // 定义 NetworkCard类实现PCI接口 class NetworkCard implements PCI { // 实现start()方法 public void start(...
11_02接口的多态性
<p>rn <p>rn 20周年限定一卡通!<span style="color:#337FE5;">可学Java全部课程</span>,仅售799元(原价10374元),<span style="color:#E53333;">还送漫威正版授权机械键盘+CSDN 20周年限量版T恤+智能编程助手!</span>rn </p>rn <p>rn 点此链接购买:rn </p>rn <table>rn <tbody>rn <tr>rn <td>rn <span style="color:#337FE5;"><a href="https://edu.csdn.net/topic/teachercard?utm_source=jsk20xqy" target="_blank">https://edu.csdn.net/topic/teachercard?utm_source=jsk20xqy</a><br />rn</span>rn </td>rn </tr>rn </tbody>rn </table>rn</p>rn<p>rn <br />rn</p>rn<p>rn Java全程课程的第一阶段,主要讲授java语言基础,涉及变量、流程控制、面向对象、IO流、集合框架、多线程、网络编程,以及常用的MySQL数据库及Java操作数据库的技术JDBCrn</p>
C#中Winform编程的3个问题
要求给出代码示例:rnrn问题1rn怎样才能在该TreeView的侧边添加一个按钮,或者是在角落上添加也行rnrnrn问题2rn悬浮面板我使用的是UserControl,问题是怎样才能指定位置显示我创建的UserControl;rn在点击浮动窗口的确定按钮后,怎样把值传递给主窗口rnrn问题1和问题2的图片说明rnrnrn[img=http://i.6.cn/cvbnm/10/7e/46/67b890a8d49c883bd3c6fc05cd49ec9a.jpg][/img]rnrn[img=http://i.6.cn/cvbnm/3e/b6/52/12f3d3b1b8ceb2968147a53842360f85.jpg][/img]rnrn[img=http://i.6.cn/cvbnm/fb/87/3c/031009b37a4348ca69ade1a79374e4f6.jpg][/img]rnrnrn问题3rn有没有快速给DataTable添加列的方法rn现有DataGridView,用于显示多张表的查询结果,要求必须使用SqlDataReader(不许使用取得DataSet,然后再取得表,直接绑定到DataGridView),然后再一行一行地填充到DataTable,再把该DataTable绑定到DataGridView的方法。rn因此产生了一个问题,SqlDataReader取得的表不同,导致每次的列都不同,所以,要每次填充表时都要重新初始化表的列名rn测试中发现用 DataTable.Columns.Add(string ColumnName)的方法或者 DataTable.Columns.Add(new DataColumn(string ColumnName))的效率很低,添加40多列需要3秒钟左右(在我的电脑上),实际查询到填充个行连也就1秒不到的时间啊,汗死rnrn我用于初始化列的方法如下rnrn #region 根据数据库中指定的表中的列名,初始化指定DataTable的列rn public static void initializeTableColumns(string TableName, DataTable Table)rn rn //TableName:数据库中的表名 Table:要初始化列的DataTablern StringBuilder SQL = new StringBuilder();rn SQL.Append("select Column_name from information_schema.columns where Table_name='").Append(TableName).Append("'"); //取得数据库中指定表的所有列名rn Console.WriteLine("开始取得列名:" + DateTime.Now.ToString("hh:mm:ss.fff"));rn DataTable TempTable = DatabaseManager.getDataSet(SQL.ToString()).Tables[0]; Console.WriteLine("取得列名完毕,开始初始化表的列:" + DateTime.Now.ToString("hh:mm:ss.fff"));rn if (TempTable.Columns[0] != null)rn rn Table.Columns.Clear();rn string ColumnName = null;rn foreach (DataRow r in TempTable.Rows)rn rn ColumnName = r[0].ToString(); //取出列名,每一行是一个列名rn Table.Columns.Add(ColumnName);rn Console.WriteLine("添加列完毕:" + DateTime.Now.ToString("hh:mm:ss.fff"));rn rn Console.WriteLine("填充各列完毕:" + DateTime.Now.ToString("hh:mm:ss.fff"));rn rn rn #endregionrnrnrnrnrn以下是执行各个步骤的当前时间,精确到毫秒rn按钮按下:04:10:50.765rn开始查询:04:10:50.765rn开始初始化列:04:10:50.765rn开始取得列名:04:10:50.765rn取得列名完毕,开始初始化表的列:04:10:51.234rnrn//关键就是下面添加列名的太慢了rnrn添加列完毕:04:10:51.250rn添加列完毕:04:10:51.250rn添加列完毕:04:10:51.265rn添加列完毕:04:10:51.265rn添加列完毕:04:10:51.265rn添加列完毕:04:10:51.265rn添加列完毕:04:10:51.281rn添加列完毕:04:10:51.296rn添加列完毕:04:10:51.296rn添加列完毕:04:10:51.312rn添加列完毕:04:10:51.328rn添加列完毕:04:10:51.343rn添加列完毕:04:10:51.375rn添加列完毕:04:10:51.390rn添加列完毕:04:10:51.421rn添加列完毕:04:10:51.437rn添加列完毕:04:10:51.468rn添加列完毕:04:10:51.515rn添加列完毕:04:10:51.546rn添加列完毕:04:10:51.593rn添加列完毕:04:10:51.640rn添加列完毕:04:10:51.687rn添加列完毕:04:10:51.750rn添加列完毕:04:10:51.796rn添加列完毕:04:10:51.843rn添加列完毕:04:10:51.906rn添加列完毕:04:10:51.968rn添加列完毕:04:10:52.046rn添加列完毕:04:10:52.125rn添加列完毕:04:10:52.187rn添加列完毕:04:10:52.281rn添加列完毕:04:10:52.359rn添加列完毕:04:10:52.453rn添加列完毕:04:10:52.562rn添加列完毕:04:10:52.656rn添加列完毕:04:10:52.765rn添加列完毕:04:10:52.875rn添加列完毕:04:10:53.000rn添加列完毕:04:10:53.125rn添加列完毕:04:10:53.250rn添加列完毕:04:10:53.406rn添加列完毕:04:10:53.546rn添加列完毕:04:10:53.703rn添加列完毕:04:10:53.843rn添加列完毕:04:10:54.015rn填充各列完毕:04:10:54.015rn初始化列完毕:04:10:54.015rnrnrnrnrnrn开始取得页数:04:10:54.015rn页数初始化完毕:04:10:54.031rn开始执行存储过程:04:10:54.031rn开始填充条目:04:10:54.062rn条目填充完毕:04:10:54.062rn开始执行存储过程:04:10:54.062rn开始填充条目:04:10:54.062rn条目填充完毕:04:10:54.078rnrnrn
C#中关于WinForm的3个问题
1.在一个子窗体中,一个按钮的DialogResult属性被设为DialogResult.OK(或DialogResult.Cancel等),如何使这个按钮被点击之后,这个子窗体不关闭?rnrn2.TreeView中的节点发生添加或删除时,如何通知程序知道(没有相应事件)?rnrn3.如何将一个XmlNode(属于一个XmlDocument)copy 到另外一个XmlDocument里(包括其子节点)?rnrn请大家赐教
JAVA#接口多态性
class Songxiaoai implements SlamDunk,Crossover,Shot{ public void slamdunk() { System.out.println(&quot;宋小艾东方翔38式旋转战斧劈扣詹姆斯&quot;); } public void crossover() { System.out.println(&quot;宋小艾疯狂变向晃晕詹姆斯&quot;); } publ...
day11_02接口的多态性
本套Java视频完全针对初级学员,课堂实录,自发布以来,好评如潮!Java视频中注重与学生互动,讲授幽默诙谐、细致入微,覆盖Java基础所有核心知识点,同类Java视频中也是代码量大、案例多、实战性强的。同时,本Java视频教程注重技术原理剖析,深入JDK源码,辅以代码实战贯穿始终,用实践驱动理论,并辅以必要的代码练习。
Java-6.22-接口多态性
要点: 接口产生的多态是指不同类在实现同一个接口的时候有不同的实现方式,那么接口变量在回调接口方法时就可以产生多种形态。 代码: ComputerAverage.java public interface ComputerAverage { public abstract double averge(double ...x); } Gymnastics.java pu
C++中的多态性 多态性
详细介绍了C++中的多态性,使读者对于C++中的多态性有深入的理解
面向对象的多态性(3)
1、纯虚函数 当在基类中不能为虚函数给出一个有意义的实现时(就是没定义函数体中的具体内容),可以声明为纯虚函数,纯虚函数可以交给派生类来完成, 纯虚函数的作用只是为派生类提供一个一致的借口,,, 纯虚函数的调用形式: virtual #include using namespace std; class point { protected: int x0, y0; public:
C#进阶之接口-3
<p style="font-size:14px;background-color:#FFFFFF;">n         这一系列课程,会为大家讲解的是VR课程的基础知识。其中包括Unity的基本操作和C#语言。n</p>n<p style="font-size:14px;background-color:#FFFFFF;">n <br /></p>n<p style="font-size:14px;background-color:#FFFFFF;">n         unity作为VR/AR课程中需要使用到的游戏引擎,第一周的时间将会讲解他的基本使用,其中包括游戏对象的创建及基本操作、地形、预设体、材质等基本操作,以及用unity做一个简单的AR项目。n</p>n<p style="font-size:14px;background-color:#FFFFFF;">n <br /></p>n<p style="font-size:14px;background-color:#FFFFFF;">n         unity作为一个面向组建的游戏引擎,如果需要实现指定的功能,只需要添加对应的组件即可。但是现有的组件并不能够满足所有的需求,所以需要我们自定义功能,而这些就需要用到脚本。在这个课程中,我们会使用C#这门编程语言来写脚本,以实现我们想要的需求。n</p>n<div>n <br /></div>
c#中类的多态性的例子
描述虚函数与飞虚函数的区别,以及多态的使用
类的多态性(3)
带编程小白入门,我上课风格是我尽量讲细一点,你学习起来就更轻松一点
c#中接口的问题
继承接口和显示继承有什么区别?
C#中的接口问题
接口最大的好处是在一个大项目里统一规范,由架构师开发统一的接口,下面的程序员写的类必须实现这个接口,这样可以保证项目里所有程序员写的类架构一致,方便日后的修改与维护rn看了这样一段话,我便想起了这样一个问题:既然下面的程序员写的类都必须实现这个接口,那么他们所写的类应该实现的功能都是一样的(尽管他们的具体的实现过程不一样),写这么多的类而只实现一个功能,我觉得太重复了,根本体会不到接口有什么过长之处。请高手指点迷津!!
关于接口的3个简单问题~~
[color=#FF0000]1、[/color]如果发生异常,不是会直接转到catch代码块嘛,怎么什么样的程序会发生多种异常呢??rnrn[color=#FF0000]2、[/color]如果当有几个异常的时候,为什么catch代码块必须从最下面的派生类开始,然后逐步到层次最高的超类以次排序?这里有什么不同?rnrn[color=#FF0000]3、[/color]rn[code=Java]public class TestTryCatch rn public static void main(String[] args)rn int i = 1;rn int j = 0;rn tryrn System.out.println("Try block entered " + "i = " + i + " j = " + j);rn System.out.println(i/j);rn System.out.println("Ending try block");rn catch(ArithmeticException e)rn System.out.println("Arithmetic exception caught");rn rn rn System.out.println("After try block");rn return; //这里放return有什么意义吗?什么情况下要在main( )方法里放return??rn rn[/code]
关于多态性中的包含多态性?
今天复习多态性,知道: rn 多态性是 不同类的对象对同一消息 作出相应,多态包含参数化多态性和[color=#FF0000]包含多态性[/color]。rnrn 对于参数化多态性,理解的。对于[color=#FF0000]包含多态性[/color]就很不理解了! 通过搜索得知:是对类型和子类型的多态。rn 能举例详细解释下么? 静静等候…… rn thanks for helping!rnrn lakee ( redsdh@gmail.com )
C#类的多态性
1.编译时的多态性:通过方法重载实现 一个类的对象调用若干同名方法,系统在编译时,根据调用方法的实参类型及实参的个数决定调用那个同名方法,实现何种操作。 2.运行时的多态性:通过虚方法实现(在方法声明前加上virtual修饰符为虚方法) 在系统运行时,不同对象调用一个名字相同,参数的类型及个数完全相同的方法,会完成不同的操作。 using System; class A{ pu...
C#类的继承与多态性练习
设计一个windows应用程序,在该程序中首先构造一个学生基本类,再分别构造小学生、中学生、大学生等派生类,当输入相关数据,单击不同的按钮将分别创建不同的学生对象。 核心代码出自《C#程序设计经典教程(第三版)》P142 namespace Test5_1 { //学生类 public abstract class Student { protected st...
C#多态性.doc_入门教程
C#多态性 通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性。C# 中的每种类型都是多态的。类型可用作它们自己的类型或用作 Object 实例,因为任何类型都自动将 Object 当作基类型。
C#多态性的介绍
C#多态性
C#基础之——动态多态性
C#的动态多态性 前言 在C#中的面向对象的三大原则为:封装、继承、多态。其中多态分为静态多态性和动态多态性。 静态多态性: 在编译时实现,有两种方法:函数重载和运算符重载。 动态多态性: 在运行时实现,有两种方法:虚函数和抽象类。 今天讨论的虚方法、抽象方法、抽象类以及接口都是以多态为基础的,在C#中多态就是通过虚方法、抽象类、接口这三种方式来实现的。 一、虚方法 定义:项目存在于相对需要实现...
深入解析C#的多态性
帮助你理解C#的多态性
C# 类的继承与多态性
C# 类的继承与多态性rn设计一个学生类,包括学号、姓名、性别属性。设计一个大学生类,继承于学生类,其属性除具备学生类的属性外,还有专业、高考成绩。设计一个中学生类,继承于学生类,其属性除具备学生类的属性外,还有年级、班级属性。对类进行测试(生成对象、输出对象属性)。
**********面试中的3个问题************
1:rn 类成员变量的初始化一般在哪里进行??rnrn2:rn 如果成员变量是指针,该如何初始化?rnrn3:rn 如果是多个(>10) 指针呢,又该如何初始化??rnrn哎,第3个问题真不知如何回答,郁闷。rnrn我觉得他第二问也问得太笼统,这完全要根据实际情况来看,有可能要分配空间,rn有可能仅仅是初始化。rnrn大家给点意见吧!!rnrn
C#学习之多态性
  1.当父类中的方法是虚方法用virtual 修饰时,在子类中才可以用override重写它; 2.当父类中的方法没有用virtual 关键字修饰时,子类不能重写它,默认子类方法用new修饰,隐藏父类同名方法; 3.接口是用来定义具体实现规则的,同时也可以保存一些共享的静态数据, 4.比如我有一个数组,被很多类使用,但又不想写通过类名去调用,这个时候就可以使用接口,将数组保存在接口中, ...
C#面向对象 多态性
http://www.cnblogs.com/zhangkai2237/archive/2012/12/20/2826734.html  转载自 Kevin 讲解的详细透彻  多态的概念:        同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。换句话说,实际上就是同一个类型的实例调用“相同”的方法,产生的结果是不同的。这里的“相同”打上双引号是因为这里的相...
C++实验3:多态性与虚函数
实验目的: 了解多态性的概念 掌握运算符重载的方法 熟练掌握静态联编和动态联编的概念和用法 掌握纯虚函数和抽象类的概念和用法 实验内容 声明一个抽象类Shape,由它派生出3个类:Circle(圆),Rectangle(矩形)、Triangle(三角形),用函数分别输出以上三个图形的周长和面积。 要求: 1.实现运算符重载 2.实现动态联编
cpp(3)多态性虚函数运算符重载
//虚函数的实例#include&amp;lt;iostream&amp;gt;using namespace std;class father{public: virtual void run()const{cout&amp;lt;&amp;lt;&quot;父亲可以跑万米!\n&quot;;} void jump()const{cout&amp;lt;&amp;lt;&quot;父亲可以跳五个台阶!\n&quot;;}};class son:public father{publi...
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法