Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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类接口的几种方法#_C#_Interface - Fatal编程技术网

C# 实现C类接口的几种方法#

C# 实现C类接口的几种方法#,c#,interface,C#,Interface,在C#中是否可能有一个类实现一个接口,该接口声明了10个方法,但只实现了5个方法,即只定义该接口的5个方法???实际上我有一个接口,它是由3个类实现的,并不是所有的类都使用所有的方法,所以如果我可以排除任何方法 我需要这个。这听起来可能是一个糟糕的设计,但它不是希望。 问题是我有一个用户控件集合,这些控件需要有公共属性,基于此,我只在运行时显示它们。因为它是动态的,所以我需要管理它们,因为我有属性。一些属性是少数类所需要的,而不是所有类所需要的。随着控件的增加,这个属性可能会随着一个控件的需要而

在C#中是否可能有一个类实现一个接口,该接口声明了10个方法,但只实现了5个方法,即只定义该接口的5个方法???实际上我有一个接口,它是由3个类实现的,并不是所有的类都使用所有的方法,所以如果我可以排除任何方法

我需要这个。这听起来可能是一个糟糕的设计,但它不是希望。
问题是我有一个用户控件集合,这些控件需要有公共属性,基于此,我只在运行时显示它们。因为它是动态的,所以我需要管理它们,因为我有属性。一些属性是少数类所需要的,而不是所有类所需要的。随着控件的增加,这个属性可能会随着一个控件的需要而增加,我需要一个控件,而不需要任何使用。只是虚拟方法。出于同样的原因,我认为如果有一种方法可以避免在课程的其他部分使用这些方法,那就太好了。听起来,除了拥有抽象类或伪函数之外,没有其他方法了:-(

您可以将其设置为抽象类,并添加不希望作为抽象方法实现的方法

换言之:

public interface IMyInterface
{
    void SomeMethod();
    void SomeOtherMethod();
}

public abstract class MyClass : IMyInterface
{
    // Really implementing this
    public void SomeMethod()
    {
        // ...
    }

    // Derived class must implement this
    public abstract void SomeOtherMethod();
}
如果这些类都需要是具体的,而不是抽象的,那么您必须从方法内部抛出一个
NotImplementedException
/
NotSupportedException
。但是更好的办法是拆分接口,这样实现类就不必这样做

请记住,类可以实现多个接口,因此,如果某些类具有部分功能,但不是全部功能,那么您希望具有更细粒度的接口:

public interface IFoo
{
    void FooMethod();
}

public interface IBar()
{
    void BarMethod();
}

public class SmallClass : IFoo
{
    public void FooMethod() { ... }
}

public class BigClass : IFoo, IBar
{
    public void FooMethod() { ... }
    public void BarMethod() { ... }
}

这可能是您真正应该拥有的设计。

您可以简单地拥有您不想实现的方法,使用“NotImplementedException”。这样您仍然可以正常实现接口。

这是不可能的。但是您可以做的是抛出
NotSupportedException
NotImplementedException
r您不想实现的方法。或者您可以使用抽象类而不是接口。这样,您可以为选择不重写的方法提供默认实现

public interface IMyInterface
{
  void Foo();

  void Bar();
}

public class MyClass : IMyInterface
{
  public void Foo()
  {
    Console.WriteLine("Foo");
  }

  public void Bar()
  {
    throw new NotSupportedException();
  }
}
或者


让您的接口在抽象类中实现。抽象类将实现5个方法,并将其余方法保持为虚拟。然后,您的所有3个类都应继承自抽象类。这是您使用3个类的客户端代码,不必更改。

您中断了接口的使用。您应该为每个常用类保留行为是一个独立的接口。

不,它不是。你必须定义接口的所有方法,但你可以将它们定义为抽象的,并将实现留给任何派生类。你不能编译一个表示实现接口的类,而事实上它没有实现接口。

虽然我同意@PoweRoy,但你可能需要将接口分成更小的部分,您可能可以使用显式接口为接口实现提供更干净的公共API

例如:

使用上面定义的类:

var cat = new Cat();
cat.Scrach();
cat.Meow();
cat.Bark(); // Does not compile


var dog = new Dog();
dog.Scratch();
dog.Bark();
dog.Meow(); // Does not compile.


IPet pet = new Dog();
pet.Scratch();
pet.Bark();
pet.Meow(); // Compiles but throws a NotSupportedException at runtime.

// Note that the following also compiles but will
// throw NotSupportedException at runtime.
((IPet)cat).Bark();
((IPet)dog).Meow();

我想动态地将控件添加到我的表单中,因为这是我的要求。我从中找到了代码。我根据需要对其进行了编辑。因此,我有一个IService类,它具有公共属性。这是由用户控件实现的。这些控件在运行时显示在不同的项目中。Hmmm为此,我有不同的公共接口,该接口具有公共属性项目用于显示控件的RTI。很少有控件需要一些额外的方法或属性,例如,在运行时基于用户选择实现上下文菜单。例如,项目中存在值,这些值将作为属性传递给控件并显示。现在此菜单仅用于一个控件控件其余部分没有。因此,我想如果有一种方法不让这些方法出现在所有类中,而不是一个类中。但听起来我需要使用虚拟方法或抽象类。hmmm虚拟方法比抽象类更适合我:-(

这里有一个简单愚蠢的例子,说明了我所说的用于不同目的的不同接口。没有用于公共属性的接口,因为这会使示例变得复杂。此外,这段代码还缺少许多其他好东西(如suspend layout)我还没有尝试编译这段代码,所以可能会有很多拼写错误,但我希望这个想法是清楚的

interface IConfigurableVisibilityControl
{
    //check box that controls whether current control is visible
    CheckBox VisibleCheckBox {get;}
}


class MySuperDuperUserControl : UserControl, IConfigurableVisibilityControl
{
    private readonly CheckBox _visibleCheckBox = new CheckBox();

    public CheckBox VisibleCheckBox 
    {
        get { return _visibleCheckBox; }
    }
    //other important stuff
}

//somewhere else
void BuildSomeUi(Form f, ICollection<UserControl> controls)
{
    //Add "configuration" controls to special panel somewhere on the form
    Panel configurationPanel = new Panel();
    Panel mainPanel = new Panel();
    //do some other lay out stuff
    f.Add(configurationPanel);
    f.Add(mainPanel);

    foreach(UserControl c in controls) 
    {
        //check whether control is configurable
        IConfigurableOptionalControl configurableControl = c as IConfigurableVisibilityControl;
        if(null != configurableControl) 
        {
            CheckBox visibleConfigCB = configurableControl.VisibleCheckBox;
            //do some other lay out stuff
            configurationPanel.Add(visibleConfigCB);
        }
        //do some other lay out stuff
        mainPanel.Add(c);
    }
}
接口IConfigurableVisibilityControl
{
//控制当前控件是否可见的复选框
复选框VisibleCheckBox{get;}
}
类MySuperDuperUserControl:UserControl,IConfigurableVisibilityControl
{
私有只读复选框_visibleCheckBox=新复选框();
公共复选框可见复选框
{
获取{return\u visibleCheckBox;}
}
//其他重要的东西
}
//其他地方
void BuildSomeUi(表格f,ICollection控件)
{
//将“配置”控件添加到窗体上的某个特殊面板中
面板配置面板=新面板();
面板主面板=新面板();
//做一些其他的布置工作
f、 添加(配置面板);
f、 添加(主面板);
foreach(控件中的UserControl c)
{
//检查控件是否可配置
IConfigurableOptionalControl configurableControl=c作为IConfigurableVisibilityControl;
if(null!=configurableControl)
{
复选框VisibleCB=configurableControl.VisibleCheckBox;
//做一些其他的布置工作
configurationPanel.Add(visibleConfigCB);
}
//做一些其他的布置工作
主面板。添加(c);
}
}

通过实现一个坚实的原则,即“接口隔离原则”,在该原则中,接口被分解为多个接口。

除了上述关于设计接口的优秀建议之外,如果您确实需要实现
var cat = new Cat();
cat.Scrach();
cat.Meow();
cat.Bark(); // Does not compile


var dog = new Dog();
dog.Scratch();
dog.Bark();
dog.Meow(); // Does not compile.


IPet pet = new Dog();
pet.Scratch();
pet.Bark();
pet.Meow(); // Compiles but throws a NotSupportedException at runtime.

// Note that the following also compiles but will
// throw NotSupportedException at runtime.
((IPet)cat).Bark();
((IPet)dog).Meow();
interface IConfigurableVisibilityControl
{
    //check box that controls whether current control is visible
    CheckBox VisibleCheckBox {get;}
}


class MySuperDuperUserControl : UserControl, IConfigurableVisibilityControl
{
    private readonly CheckBox _visibleCheckBox = new CheckBox();

    public CheckBox VisibleCheckBox 
    {
        get { return _visibleCheckBox; }
    }
    //other important stuff
}

//somewhere else
void BuildSomeUi(Form f, ICollection<UserControl> controls)
{
    //Add "configuration" controls to special panel somewhere on the form
    Panel configurationPanel = new Panel();
    Panel mainPanel = new Panel();
    //do some other lay out stuff
    f.Add(configurationPanel);
    f.Add(mainPanel);

    foreach(UserControl c in controls) 
    {
        //check whether control is configurable
        IConfigurableOptionalControl configurableControl = c as IConfigurableVisibilityControl;
        if(null != configurableControl) 
        {
            CheckBox visibleConfigCB = configurableControl.VisibleCheckBox;
            //do some other lay out stuff
            configurationPanel.Add(visibleConfigCB);
        }
        //do some other lay out stuff
        mainPanel.Add(c);
    }
}
public static class myExtension {
    public static void myMethod( this ImyInterface obj, ... ) { .. }
...
}