小编Fak*_*war的帖子

我们可以使用接口变量调用其接口中未定义的实现类中的方法吗?

是否可以在接口的实现类中调用一个方法,该接口未使用接口变量在接口中定义,如下所示:

interface ILookup {
            public void someInterfaceMethod1();
            public void someInterfaceMethod2();
}
Run Code Online (Sandbox Code Playgroud)

......和实施类:

public class extendedLookUpImplementor: ILookup
{
          //constructor
          LookUpImplementor(){
          }

          public void someInterfaceMethod1(){
           // Implementation Code here.
          }

          public void someInterfaceMethod2(){
           // Implementation Code here.
          }

          public void ExtendedMethod(){
           // Implementation Code here.
          }

}
Run Code Online (Sandbox Code Playgroud)

在客户端代码中:

ILookup lookupVar = new LookUpImplementor();
lookupVar -> someInterfaceMethod1(); // i know it will work.
lookupVar -> someInterfaceMethod2(); // i know it will work.
Run Code Online (Sandbox Code Playgroud)

我的问题是,我可以使用lookupVar调用ExtendedMethod,如下所示:

lookupVar -> ExtendedMethod(); // Note again that ExtendedMethod() is not …
Run Code Online (Sandbox Code Playgroud)

c# oop

5
推荐指数
1
解决办法
1339
查看次数

基类实现基接口而派生/具体类实现扩展接口,为什么?

我正在读一本书"用.NET编写的.NET域驱动设计".

问题基于以下类图所示的场景:

图:http: //screencast.com/t/a9UULJVW0

在此图中,

A)IRepository接口由(抽象基类)RepositoryBase实现,而

B)IRepository接口也由接口ICompanyRepository(ICompanyRepository : IRepository)扩展.

C)ICompanyRepository由CompanyRepository实现,它派生自SQLRepositoryBase,它源自RepositoryBase(;如A点所述),实现IRepository,如果是ICompanyRepository则为父级.

D)我创建了一个接口ICompanyRepository的变量,它引用了clas CompanyRepository的对象,如下所示:

ICompanyRepository comRep = new Company Repository();
Run Code Online (Sandbox Code Playgroud)

现在,如果我用ICompanyRepository变量comRep调用Add()函数...

comRep.Add(); 
Run Code Online (Sandbox Code Playgroud)

然后调用RepositoryBase类(它是CompanyRepository的父级)中的Add()函数.

我的问题: 由于调用(抽象 - 基础)类"RepositoryBase"中的函数Add()被调用,确切的基于面向对象的规则/机制是什么?为方便起见,我在下面陈述两种可能的机制:(请告诉我下面两个中哪一个是正确的潜在机制)

机制-1 是否调用了基类"RepositoryBase"中的Add()函数,因为"RepositoryBase"实现了IRepoitory?(因此强制RepositoryBase类实现IRepository以调用Add())

要么

机制-2: 调用基类"RepositoryBase"中的Add()函数是因为CompanyRepository实现了ICompanyRepository,它实现了包含Add()函数定义的IRepository,这样当调用Add()函数(带有变量)ICompanyRepository时,它首先找到定义在ICompanyRepository中添加然后在父接口IRepository中然后跳转到CompanyRepository类以查找Add()函数的实现而没有找到Add()函数的定义它向上遍历到父类SQLRepositoryBase以查找Add()函数等等,并且它在RepositoryBase类中找到函数Add(),因此它调用RepositoryBase中的Add()函数.这意味着如果它在RepositoryBase的任何派生类中找到了Add()函数,它没有进一步向上(在父类中).所有这些也意味着,为了从派生类遍历类链中的父类只是为了找到Add()函数,RepositoryBase类真的不需要直接从IRepository继承吗?


在我的问题中还有其他的事情,我无法理解在我的案例中适用的OO规则如下所述:

在我的问题中有两个接口,一个是父级,即IRepository,另一个是扩展它,即ICompanyRepository.父接口IRepository包含Add()函数的定义,但不包含子接口ICopmanyRepository.

类Hierarchy"CompanyRepository"链中的最后派生类实现ICompanyRepository(CompanyRepository不实现IRepository接口的Add()函数)而root(最顶层父)(抽象基础)类即RepositoryBase实现Add()函数.

所以结构就像http://screencast.com/t/a9UULJVW0中显示的图像.

现在,如果我调用Add()函数:

codeICompanyRepository lastDerived = new CompanyRepository(); ICompanyRepository->添加();code

然后根据您在回答中所述的OO规则,查找将从CompanyRepository类开始,期望CompanyRepository将已实现Add()函数作为 codeIRepository.Add(){} //从[link]中的P17和P18推导出来http://www.codeproject.com/Articles/18743/Interfaces-in-C-For-Beginners[link]code

但是,在我的案例类中,CompanyRepository没有实现IRepository.Add(){},尽管控制流(在跟踪时)成功跳转到基类中的Add()函数(并且代码工作正常).我无法理解哪个OO规则适用于此处?

如果您需要我使用代码显示上述方案,请告诉我.

c# oop inheritance interface interface-implementation

5
推荐指数
1
解决办法
3415
查看次数

应用程序配置文件中SQL Server 2008(版本10.0.1600)的连接字符串

我是新手创建连接字符串和应用程序配置文件.我使用一个示例显示使用文件连接到SQL Server CE,这是我不想要的,而是我想连接到SQL Server 2008标准版.

http://www.connectionstrings.com/sql-server/等几个链接上探索连接字符串时,我发现Connection字符串使用了属性"Data Source =",在某些地方它使用了"Server ="这是安静的混乱.

这是我在应用程序配置文件中的内容.

<connectionStrings>
    <add name="ShareManagement" 
         connectionString="Data Source=localhost" 
         providerName="System.Data.SqlClient"/>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

我希望有人告诉我需要使用哪些属性以及它们各自的值应该是什么.(我使用默认sa用户作为UserID和密码并使用SQL Server身份验证模式.我的SQL Server数据库安装在我的Visual Studio解决方案/应用程序所在的同一台机器/服务器上).

Ragards.

c# sql-server connection-string app-config

4
推荐指数
1
解决办法
1万
查看次数

git:在稀疏签出、拉取、合并冲突后丢失了我的工作目录

我已经丢失了所有分支的 git 中的所有项目数据,并且无法恢复。

我创建了三个分支:'master''distribution''remoteerp'(全部具有相同的代码,仅备份)并签出到remoteerp,然后我将稀疏签出配置配置为 true 并将/.git/info/sparse-checkout文件更新为/inoERP/inoerp/www//inoERP/inerp/inoerp-server。然后,我从 github 中提取了我的 fork-project,如下所示:

git remote add -f githubinoerp [github_url_to_my_fork_repo]
git pull githubinoerp master
Run Code Online (Sandbox Code Playgroud)

这会导致 License.txt 和 Copyright.txt 发生冲突,并且仅在工作目录中显示这些文件。由于我无法解决合并冲突(我仍在作为初学者学习 git),我只是尝试使用重置为旧状态,git reset --hard但它没有改变任何接受说类似sparse-checkout has changed your working directory. 随后检出其他分支(如分发和主分支)也不会显示原始文件。我已经在(签出后)所有分支上尝试过 git reset Head --hard 和 git reset --hard 但没有用。

我怎样才能将我的项目恢复到旧状态?

git recovery pull sparse-checkout

1
推荐指数
1
解决办法
826
查看次数