日期:2014-05-18  浏览次数:20765 次

类,接口!
一个类实现了多个接口中的方法,在实际应用中是用类来调用方法?,还是用接口来调用方法?
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 有关类的技术实验3
{
  public interface IMyInterface {
  void Method();
  
  }
  public interface IMyInterface2
  {
  void Method2();
   
  }
  public class MyClass : IMyInterface, IMyInterface2
  {
  public void Method()
  {
  Console.WriteLine("Greetings from IMyInterface ");
  }

  public void Method2()
  {
  Console.WriteLine("Greetings from IMyInterface2");
  }
  }

  class Program
  {  

  static void Main(string[] args)
  {
  IMyInterface a = new MyClass();
a.Method();
IMyInterface2 b = new MyClass();
b.Method2();
  MyClass c = new MyClass();
c.Method();
c.Method2();
  Console.ReadKey();
  }
  }
}

实际应用中,是红色的使用的多,还是天蓝色的使用的多?,使用这两种方法技术上的称呼叫什么?
还有
  IMyInterface a = new MyClass();
a.Method();
这段代码,听大牛们说,new是创建了一个引用,把地址传给了a,我的问题是,类的地址传给了接口,这样的隐式转换没问题吗?我只看到过,继承类可以隐式地转换给基类... ...

------解决方案--------------------
一般红色部分用得多,将子类对象的引用传给父类引用的变量就是实现多态的方法了,是面向对象的重要思想。

在这里可以将接口看成是一个纯抽象类,其实实现它的类跟它也是继承关系,它们之间也可以看成是"is a"关系。
只是接口更强调的是对外部提供了那些操作,继承它的类一定要实现它的方法,所以你知道如果一个类继承了一个接口的话,那么
这个类一定提供了接口中声明的方法的实现。

你可以将接口看成是提供了一种标准,比如客户提出一个标准,只要我给出满足这个标准的插件,就一定能在客户的程序中正常使用。


------解决方案--------------------
引用楼主 only_lonely 的帖子:
这段代码,听大牛们说,new是创建了一个引用,把地址传给了a,我的问题是,类的地址传给了接口,这样的隐式转换没问题吗?我只看到过,继承类可以隐式地转换给基类... ...

------解决方案--------------------
没有必要在字眼上扣的太死,看看e文的MSDN

http://msdn.microsoft.com/en-us/library/ms173110.aspx

Because classes are reference types, a variable of a class object holds a reference to the address of the object on the managed heap. If a second object of the same type is assigned to the first object, then both variables refer to the object at that address. This point is discussed in more detail later in this topic. 

所以你可以说x、y、a、b、c都是同一个对象,因为这些变量都引用同一托管堆地址上的对象

也有人习惯说x、y、a、b、c是同一个对象的引用,它们指向同一个对象new MyClass()
------解决方案--------------------
同意sp123和amandag

在C#中不要玩什么地址的概念,除非你要写非托管代码、unsafe代码,对象就是对象,x、y、a、b、c他就是同一个对象。

至于是“用类来调用方法还是用接口来调用方法”,这一是要看你是怎么实现的,如果显示实现接口方法,那只能通过接口来调用,而如果是隐式实现,像楼主写的那样的,那既可以用类也可以用接口来调用。二是要看你调用的地方的需要,这就是上面有人说的这模式那模式的了,对于这些,我的观点是应用为王,能满足你的需要的就是合适的,而为了模式而模式的,那就是舍本逐末了。

另外,摘录一下msdn中关于ref的:
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
按引用传递值类型是有用的,但是 ref 对于传递引用类型也是很有用的。这允许被调用的方法修改该引用所引用的对象,因为引用本身是按引用来传递的。