解决了一直困惑我的接口问题

前几天再写asp.net 的三层结构,数据库要求跨平台,用到反射技术来动态生成数据库类对象,用接口使方法统一.
问题就在这个接口上:
我在csdn .net论坛上发帖的内容为:
地址为:http://community.youkuaiyun.com/Expert/topic/5103/5103400.xml?temp=.284115
//解决方案一:

//Interf.cs   在项目InterF中
namespace InterF
{
    public interface I_InterF
    {
        string F();
    }
}

 


//A.cs  在项目A中
using InterF
namespace A
{
    public class A_Class:I_InterF      //继承 InterF 接口
    {
        public string F()              //实现 InterF 中的 F()
        {
           return "aaaaaaa";
        }
    }
}

 


//B.cs  在项目B中
using InterF
namespace B
{
    public class B_Class:I_InterF     //继承 InterF 接口
    {
        public string F()             //实现 InterF 中的 F()
        {
           return "bbbbbbb";
        }
    }
}


//Factory.cs 在项目Factory中
namespace Fac
{
    public class Fac_Class
    {
       public I_InterF Fac_Function
       {
          string assumellyName = ConfigurationManager.AppSettings["AssumelyName"];
          string constructorName = ConfigurationManager.AppSettings["ConstructorName"];
          return (I_InterF)Assembly.Load(assumellyName).CreateInstance(constructorName);
       }
    }
}


//web.config 
    <add key="AssumelyName" value="A"/>
    <add key="ConstructorName" value="A.A_Class"/>


//Test.cs  在项目BLL中
using Fac;
using InterF;

namespace BLL
{
    public class BLL_Class
    {
        public string BLL_Funtcion()
        {
           return (new Fac_Class()).Fac_Function().F();
        }
    }
}

 

-------------------------------------------------------------------------------
//解决方案二:


//A.cs  在项目A中
namespace A
{
    public class A_Class  
    {
        public string F()    
        {
           return "aaaaaaa";
        }
    }
}


//B.cs  在项目B中
namespace B
{
    public class B_Class
    {
        public string F()      
        {
           return "bbbbbbb";
        }
    }
}


//Factory.cs 在项目Factory中
namespace Fac
{
    public class Fac_Class
    {
       public Object Fac_Function
       {
          string assumellyName = ConfigurationManager.AppSettings["AssumelyName"];
          string constructorName = ConfigurationManager.AppSettings["ConstructorName"];
          return Assembly.Load(assumellyName).CreateInstance(constructorName);
       }
    }
}


//web.config 
    <add key="AssumelyName" value="A"/>
    <add key="ConstructorName" value="A.A_Class"/>


//Test.cs  在项目BLL中

using Fac;
using A;
using B;
namespace BLL
{
    public class BLL_Class
    {
        public string BLL_Funtcion()
        {
           return (new Fac_Class()).Fac_Function().F();
        }
    }
}


问题一:  解决方案一
在Factory.cs中制造了A的对象已接口InterF的方式返回,在 BLL中调用的是
Interf.cs中的F(),虽然A.cs和B.cs都继承了InterF的接口,为什么调用Interf.cs中的F()
就能得到  "aaaaaaa"  应该是调用A中的F()才能得到的呀


问题二:    解决方案二
没有使用接口,A中有个F(),B中也有个F() 分别再两个命名空间中(A,B)
制造一个A的对象:(new Fac_Class()).Fac_Function()
调用A中的方法:(new Fac_Class()).Fac_Function().F()  会出错
A中的F(),B中的F() 不是再两个命名空间中的吗,为什么会出错



下面是 aafshzj(上海北京) ( 五级(中级)) 信誉:100    Blog            的回答:
呵呵,这么多问题才20分?


问题一:问题在于你创建的是A的实例啊,A的实例被通过InterF引用调用F方法得到  "aaaaaaa"不是很正常吗?你认为应该得到什么?、


问题二:出错很正常啊,原因不在于A和B的共存而在于(new Fac_Class()).Fac_Function()创建的是一个object,而object根本没有F这个方法。

InterF只是接口,可以被看作纯Abstract类型。它的所有方法相当于默认加了abstract/virtual修饰符的,实现接口的类型的接口方法相当于默认加了override方法的。这意味着什么呢?意味着InterF引用的实例在执行借口方法时,将执行其实现类型的方法。这也很自然,因为接口方法都是没实现的空方法(不是方法体为空,是方法本身实际上就相当于空指针),也只有实现其具体实例的实际类型方法才合适。

实际上所有类型实例,无论其以什么基类型被引用,其实际执行的基类方法都是override层层覆盖中最后覆盖的一个,也就是实际实例的方法(不考虑new 修饰符中断override覆盖的情况)。

终于把问题给搞清楚了,很感谢aafshzj(上海北京) 的回答

<think>嗯,用户提到VirtualBox的网卡名称一直带有#2后缀,想要解决这个问题。首先,我需要理解为什么会出现这种情况。在VirtualBox中,当创建或配置虚拟机时,网络适配器的名称可能会自动生成,如果存在冲突或重复,系统可能会添加后缀来区分不同的适配器实例。 用户可能是在创建多个虚拟机或多次修改网络设置后,发现网卡名称中总是出现#2,这可能让他们觉得困惑或者影响管理。需要确定的是,这个后缀是否真的导致了问题,或者只是名称上的不美观。如果是后者,可能需要指导用户如何重命名网卡;如果是前者,可能需要检查网络配置是否有冲突。 接下来,我应该考虑可能的原因。一种可能是VirtualBox在创建新的网络适配器时检测到已有同名适配器,因此自动添加了后缀。例如,如果用户之前创建过一个网络适配器,后来删除了,但VirtualBox可能仍然保留了一些配置,导致新创建的适配器名称被自动编号。此外,用户可能手动更改过网络设置,导致系统自动添加了后缀。 解决方案方面,首先应该建议用户检查现有的网络适配器列表,确认是否存在重复或残留的配置。在VirtualBox的管理界面中,进入全局设置,查看网络部分,删除不再使用的虚拟网络适配器。然后,当创建新的适配器时,系统应该会从#2开始编号,但如果旧的适配器已被清理,可能可以避免这种情况。 另外,用户可能希望直接重命名虚拟网络接口的名称。在VirtualBox中,虽然界面可能不允许直接修改名称,但可以通过命令行工具VBoxManage来实现。例如,使用VBoxManage list hostonlyifs列出所有主机网络,然后使用VBoxManage hostonlyifs rename <旧名称> <新名称>来重命名。这样用户就可以将带有#2后缀的名称更改为更合适的名称。 此外,还需要提醒用户在操作前备份虚拟机配置,避免误操作导致的问题。如果用户不熟悉命令行工具,可能需要提供详细的步骤说明,并指出在重命名过程中可能需要关闭相关的虚拟机。 另外,如果用户的问题是由于网络配置残留导致的,清理旧的虚拟网络适配器可能会有帮助。在VirtualBox中,删除不再使用的适配器,然后重新创建新的适配器,可能会得到预期的命名,而不会自动添加后缀。 总结来说,解决步骤可能包括:检查并清理旧的网络适配器、重命名现有适配器、重新配置虚拟机的网络设置。同时,需要指导用户如何正确使用VBoxManage工具,并提醒注意事项,比如关闭虚拟机后再进行修改,避免配置冲突。</think>在 VirtualBox 中,虚拟网卡名称自动带有 `#2` 后缀通常是以下原因导致的: --- ### **原因分析** 1. **重复创建或残留配置** VirtualBox 会自动为虚拟网卡命名(例如 `VirtualBox Host-Only Ethernet Adapter`),如果检测到名称冲突(比如已存在同名网卡或被删除的残留配置),系统会自动添加 `#2`、`#3` 等后缀以区分。 2. **手动删除后残留注册表项** 如果之前删除过网卡但未彻底清理注册表或配置,VirtualBox 可能仍认为旧名称已被占用。 --- ### **解决方法** #### **方法 1:通过 VirtualBox 管理界面清理并重建** 1. **关闭所有虚拟机** 确保所有虚拟机处于关闭状态。 2. **删除旧虚拟网卡** - 打开 VirtualBox 主界面,进入 **全局设置(Global Settings) > 网络(Network)**。 - 在 **Host-only Networks** 选项卡中,删除所有不再需要的虚拟网卡(尤其是带 `#2` 后缀的)。 3. **重新创建虚拟网卡** - 点击 **添加新虚拟网卡** 按钮(螺丝刀图标),VirtualBox 会生成新的网卡(通常从 `#1` 开始命名)。 --- #### **方法 2:使用命令行重命名网卡** 如果已存在需要保留的虚拟网卡,可通过 `VBoxManage` 工具直接重命名: 1. **打开命令提示符或终端** 以管理员权限运行。 2. **列出当前虚拟网卡** ```bash VBoxManage list hostonlyifs ``` 记录要修改的网卡名称(例如 `VirtualBox Host-Only Ethernet Adapter #2`)。 3. **重命名网卡** ```bash VBoxManage hostonlyifs rename "旧名称" "新名称" ``` 例如: ```bash VBoxManage hostonlyifs rename "VirtualBox Host-Only Ethernet Adapter #2" "MyCustomAdapter" ``` --- #### **方法 3:清理注册表(仅限 Windows)** 如果上述方法无效,可能是注册表残留导致: 1. 按下 `Win + R`,输入 `regedit` 打开注册表编辑器。 2. 导航到路径: `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}` 3. 查找与旧虚拟网卡相关的子项(可能需要逐个检查),删除残留条目。 4. **重启电脑** 后重新创建虚拟网卡。 --- ### **注意事项** - 操作前建议备份虚拟机配置或创建系统还原点。 - 重命名或删除网卡可能导致依赖该网卡的虚拟机网络设置失效,需重新配置虚拟机的网络适配器。 通过以上方法,应能解决 VirtualBox 网卡名称后缀为 `#2` 的问题。如果问题依旧,可能是 VirtualBox 版本存在 Bug,可尝试更新到最新版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值