Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于创建可选属性的C#接口_C#_Interface - Fatal编程技术网

用于创建可选属性的C#接口

用于创建可选属性的C#接口,c#,interface,C#,Interface,我用C#编写了接口,并且它已经由类实现了。我是否可以在接口中添加一个或多个属性作为可选属性,而不修改现有的实现类 例如 在这本书中,芬德温道已经写好了。是否可以添加一个可选属性而不在现有类中实现 即 您可以创建一个新界面,希望使用该选项的形状将从该界面派生: public interface IWindowedShape : IShape { string WindowName{get;} } 因此,如果向您传递了一个IShape,您现在可以尝试对iIndowedShape进行强制转换

我用C#编写了接口,并且它已经由类实现了。我是否可以在接口中添加一个或多个属性作为可选属性,而不修改现有的实现类

例如

在这本书中,芬德温道已经写好了。是否可以添加一个可选属性而不在现有类中实现


您可以创建一个新界面,希望使用该选项的形状将从该界面派生:

public interface IWindowedShape : IShape
{
    string WindowName{get;}
}
因此,如果向您传递了一个
IShape
,您现在可以尝试对
iIndowedShape
进行强制转换,以便能够访问此可选属性

public void DoStuff(IShape shape)
{
   var windowed = shape as IWindowedShape;
   string windowName = null;
   if(windowed!=null)
   {
      windowName = windowed.WindowName;
   }
}

没有接口可选成员的概念

这里需要定义两个接口。一个包含
区域
,另一个包含
窗口名
。大概是这样的:

public interface IShape
{
    int area { get; }
}

public interface IFindWindow: IShape
{
    string WindowName { get; }
}
然后实现类可以选择实现
IShape
IFindWindow

在运行时,您只需使用
is
操作符来确定手头的对象是否实现了
IFindWindow

IShape shape = ...;
if (shape is IFindWindow)
    ....
要实际使用更派生的接口,请使用
as
运算符:

IShape shape = ...;
IFindWindow findWindow = shape as IFindWindow;
if (findWindow != null)
    string windowName = findWindow.WindowName;

不,这是不可能的。若从接口派生,则必须在派生类中定义其所有成员

要实现您想要的,您可以考虑使用
抽象类

用例示例:

public abstract class Base {
    public abstract Name {get;set;} // MUST DEFINE IN DERIVED CLASS, LIKE INTERFACE

    public string Surname {get;set;} // JUST A SIMPLE PROPERTY OF A BASE CLASS
}

另一方面,若您需要目标分离,请定义多个具有不同属性的
接口
,并在需要时从适当的接口派生

接口的本质是您必须实现所有提供的方法和/或属性

在您的情况下,您可以创建新的第二个接口,该接口继承自原始接口:

public interface IShape
{
    int area { get; }
}

public interface IShapeEx : IShape
{
    string WindowName { get; }
}

您的新类将实现
ishapex
,而您的“遗留类”仍将实现
IShape

如果它是可选的,那么它是无用的。不,你不能这样做。@sNotALie。我不同意这种说法(当然我可能是错的)。在这样的情况下,您已经有了一个在大量类中实现的接口,并且您需要一些道具来传递,这仅仅是因为两个新类有了新的行为,将其添加到每个类中可能会很乏味,因为您需要因为这1个或2个类而注入1个道具。如果它只是一个空道具,只被那些类使用,而没有任何机会出现更多具有这种行为的类,那么它肯定是无用的。拥有默认的实现道具或somth会很酷。@MantasDaškevičius如果你想要默认的impls,请查看
摘要
。否则,为什么不制作一个子接口呢?@It'sNotALie。我只是想表达我的观点。TBH,是的,我会在那个类上再创建并实现一个接口,然后检查已解析的类是否实现了它。从某种意义上说。。。是 啊一方面,它有点超出了接口的用途
public abstract class Base {
    public abstract Name {get;set;} // MUST DEFINE IN DERIVED CLASS, LIKE INTERFACE

    public string Surname {get;set;} // JUST A SIMPLE PROPERTY OF A BASE CLASS
}
public interface IShape
{
    int area { get; }
}

public interface IShapeEx : IShape
{
    string WindowName { get; }
}