如果类实现两个接口,并且这两个接口包含具有相同签名的成员,那么在类中实现该成员将导致两个接口都使用该成员作为它们的实现。例如:
{
void Paint();
}
interface ISurface
{
void Paint();
}
class SampleClass : IControl, ISurface
{
// Both ISurface.Paint and IControl.Paint call this method.
public void Paint()
{
}
}
然而,如果两个接口成员执行不同的函数,那么这可能会导致其中一个接口的实现不正确或两个接口的实现都不正确。可以显式地实现接口成员 -- 即创建一个仅通过该接口调用并且特定于该接口的类成员。这是使用接口名称和一个句点命名该类成员来实现的。例如:
{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}
类成员 IControl.Paint 只能通过 IControl 接口使用,ISurface.Paint 只能通过 ISurface 使用。两个方法实现都是分离的,都不可以直接在类中使用。例如:
//obj.Paint(); // Compiler error.
IControl c = (IControl)obj;
c.Paint(); // Calls IControl.Paint on SampleClass.
ISurface s = (ISurface)obj;
s.Paint(); // Calls ISurface.Paint on SampleClass.
显式实现还用于解决两个接口分别声明具有相同名称的不同成员(如属性和方法)的情况:
{
int P { get;}
}
interface IRight
{
int P();
}
为了同时实现两个接口,类必须对属性 P 和/或方法 P 使用显式实现以避免编译器错误。例如:
{
public int P() { return 0; }
int ILeft.P { get { return 0; } }
}
本文链接
类是使用关键字 class 声明的,如下面的示例所示:
{
// Methods, properties, fields, events, delegates
// and nested classes go here.
}
下面的示例说明如何声明类的字段、构造函数和方法。该例还说明了如何实例化对象及如何打印实例数据。在此例中声明了两个类,一个是 Child 类,它包含两个私有字段(name 和 age)和两个公共方法。第二个类 TestClass 用来包含 Main。
{
private int age;
private string name;
// Default constructor:
public Child()
{
name = "N/A";
}
// Constructor:
public Child(string name, int age)
{
this.name = name;
this.age = age;
}
// Printing method:
public void PrintChild()
{
Console.WriteLine("{0}, {1} years old.", name, age);
}
}
class StringTest
{
static void Main()
{
// Create objects by using the new operator:
Child child1 = new Child("Craig", 11);
Child child2 = new Child("Sally", 10);
// Create an object using the default constructor:
Child child3 = new Child();
// Display results:
Console.Write("Child #1: ");
child1.PrintChild();
Console.Write("Child #2: ");
child2.PrintChild();
Console.Write("Child #3: ");
child3.PrintChild();
}
}
/* Output:
Child #1: Craig, 11 years old.
Child #2: Sally, 10 years old.
Child #3: N/A, 0 years old.
*/
注意:在上例中,私有字段(name 和 age)只能通过
Child 类的公共方法访问。例如,不能在 Main
方法中使用如下语句打印 Child 的名称:
本文链接
最近在做一个项目时遇到需要在文本框中进行上下标的处理,单纯的文本控件TextBox满足不了这个功能,必须使用RichTextBox富文本控件来实现,具体效果如下:
未设置上标字体大小前:设置上标的字体大小后
具体的代码如下:
this.richTextBox1.SelectedText = "mm";
this.richTextBox1.Font = new Font("宋体", 8, FontStyle.Regular);
this.richTextBox1.SelectionCharOffset = 3; //位移的像素,正数为上移,负数为下移
this.richTextBox1.SelectedText = "2";
代码很简单,但是有个注意事项:this.richTextBox1.Font = new Font("宋体", 8, FontStyle.Regular);此行代码的位置很关键,如果在最后一行或者第一行显示,那么整个richTextBox1的字体大小都是8了,整个显示都很小;如果不设置,默认的字体是10号字体,显示的上面的那个2很大,效果不好如上图所示。
本文链接