C# 提取接口隐藏成员的细节,如果';它也是一个界面

C# 提取接口隐藏成员的细节,如果';它也是一个界面,c#,C#,我有一个类Project,我想从中提取一个接口,因为我们要处理不同类型的项目。然而,项目的一个属性称为数据: class Project { public Data D {get;} public void SomeSpecificMethodReferencingData() { D.SomeSpecificMethod(); } } class Data { public void SomeGenericMethod() { }

我有一个类
Project
,我想从中提取一个接口,因为我们要处理不同类型的项目。然而,
项目
的一个属性称为
数据

class Project {
    public Data D {get;}
    public void SomeSpecificMethodReferencingData() 
    { 
      D.SomeSpecificMethod(); 
    }
}

class Data {
   public void SomeGenericMethod() { }
   public void SomeSpecificMethod() { }
}
现在,
数据
也需要提取为接口(但仅定义
SomeGenericMethod()

interface IProject {
    IData D {get;}
}

interface IData {
    void SomeGenericMethod();
}

class Data : IData {
    public void SomeGenericMethod() { }
    public void SomeSpecificMethod() { }
}

class OtherData : IData {
    public void SomeGenericMethod() { }
    public int SomeOtherSpecificMethod(float someArgument) { }
}

class Project : IProject {
    public IData D { get; }
    public void SomeSpecificMethodReferencingData()
    { 
      D.SomeSpecificMethod(); // this does not work!
      (D as Data).SomeSpecificMethod(); // this looks stupid!
    }
}

class OtherProject : IProject {
    public IData D { get; }
    public void SomeOSpecificMethodReferencingOtherData()
    {
       var i = D.SomeOtherSpecificMethod(14.0f); // this does not work!
       var i = (D as OtherData).SomeOtherSpecificMethod(14.0f); // this looks stupid!
    }
}
我遇到的问题是,在
Project
类中,我引用了
SomeSpecificMethod
。然而,当我为
数据
提取接口时,我首先必须从
IData
中转换它,以便能够引用特定的方法。这是不可取的,因为IData始终是该类的数据实例当我构建我的
OtherProject
时,我将为它创建一个
OtherData
,以便获得成对的xxxProject和xxxData实现


是否有某种设计模式可以帮助我构建相关和引用类对?比如抽象工厂,但更好?

您可以使用泛型:

interface IProject<T> where T: IData {
    T D {get;}
}
接口项目,其中T:IData{
T{get;}
}
现在,您的不同项目如下所示:

class Project : IProject<Data> 
{
    public Data D { get; }
    public void SomeSpecificMethodReferencingData()
    { 
        D.SomeSpecificMethod();  // D is of type Data
    }
}

class OtherProject : IProject<OtherData> {
    public OtherData D { get; }
    public void SomeOSpecificMethodReferencingOtherData()
    {
         D.SomeOtherSpecificMethod(14.0f); // D is of type OtherData
    }
}
类项目:i项目
{
公共数据D{get;}
public void someSpecificMethodReferenceGData()
{ 
D.SomeSpecificMethod();//D是数据类型
}
}
其他项目类别:IProject{
公共其他数据D{get;}
public void somespecificMethodReferenceGotherData()的引用
{
D.SomeOtherSpecificMethod(14.0f);//D的类型为OtherData
}
}

您可以有3个单独的接口:

interface IData:ISpecificData, IGenericData
    {    
    }
    interface ISpecificData
    {
        void SomeSpecificMethod();
    }
    interface IGenericData
    {
        void SomeGenericMethod();
    }

当您只需要其中一个方法时,您只能使用其中一个接口;当您在引用数据类的某个特定方法的类项目中同时需要这两个方法时,您可以使用
IData

您没有使用
IData
接口中的任何内容-因此在
Project
类中使用
IData
没有任何意义

在你们的例子中,这样做是可能的,它会起作用——但这是“错误的方式”


它看起来很愚蠢-但出于其他原因。如果
D
不是
Data
,而是
OtherData
?它在编译时是完全正确的,但在运行时会爆炸!

你能不能显示出麻烦的代码?你所说的问题还不清楚。如果你所有的
IData
实例对象是什么,接口为什么只包含那个类的一个成员?所以,要么为那个成员做另一个接口,要么把它转换成那个,或者把这个成员添加到<代码> IDATA < /C>。你是否考虑过使用类似于<代码>接口iTeaTeDATA:IDATA < /代码>或类似的东西?那么你可以拥有<代码>类项目t:IProject…您正在引用
SomeSpecificMethod
。关键是此方法未在接口
IData
中定义。只有具体的实现定义了此方法。这就是为什么您必须强制转换到实现才能访问此方法。将方法
SomeSpecificMethod
添加到接口同样,您是否考虑过在每个xxx项目中使用:
private xxxData MyD=>(xxxData)D、 
-也不是很漂亮。我在想的另一件事是:这里可能有一个概念性的问题吗?
某些特定方法
背后的逻辑真的是一个关于
数据
的问题吗?或者更具体地说是关于
项目
应该如何处理
数据的问题吗?因此,也许也应该考虑其他模式?比如strategy pattern,factory,…@BionicCode,因为…?从我的观点来看,我们只需要特定项目中的特定内容,它知道它所属的数据类型。@BionicCode这不是问题,除非OP想在
项目
之外使用
SomeSpecificMember
,而他/她不需要。@BionicCode不,他是just不知道泛型。这就是他使用IData作为成员类型的原因。这也是他首先遇到这个问题的原因。@BionicCode显然OP不想用
Data
特定的东西污染
IData
。@Henri是的,你必须在编译时知道项目
Data
-类型。或者创建一个非泛型base-i
i项目
从中派生出来的接口,或者(可能更好?)有两个接口-
i数据
(使用
SomeGenericMethod
)和继承i数据的
isecficicdata
(使用
SomeSpecificMethod
)如何解决
OtherProject.D.SomeOtherSpecificMethod(float)
?请注意
SomeOtherSpecificMethod
的参数“如果D不是数据,而是其他数据呢?它在编译时会完全正确,但在运行时会爆炸!”我知道这一点,所以理想情况下我想使用
数据
作为属性,但我不再实现该接口了(它需要实现IData,因为我需要
IProject.D.SomeGenericMethod
调用)
  (D as Data).SomeSpecificMethod(); // this looks stupid!