【问题标题】:OOPS query using c#使用 C# 的 OOPS 查询
【发布时间】:2010-07-13 11:46:01
【问题描述】:

我对类和接口的实现有些疑问

我有 2 节这样的课

Public Class A:IFinal
  {
      private string name=string.Empty;

        A()
        {
            name = "Pankaj";
        }

        public string MyName()
        {
            return name;
        }

        public string YourName()
        {
            return "Amit";
        }
   }

Public  Class B:IFinal
 {
     private string name=string.Empty;

        B()
        {
            name = "Amit";
        }

        public string GetNane()
        {
            return name;
        }

        public string YourName()
        {
            return "Joy";
        }
   }

问题:

  1. 现在我有一个接口 IFinal,我想在类 A 和 B 中为方法 YourName() 实现这个接口

    公共接口 Ifinal {

         string YourName();// Class A & Class B
    
    
    }
    

这种方式可以实现吗?如果是,那么我如何在界面中声明 YourName() 以及如何使用它?

  1. 是否可以在接口中声明虚方法?就像在 A 和 B 类中一样,我们有一个需要在接口中声明的虚方法。

【问题讨论】:

  • 什么?我不明白你的问题。接口中的所有方法都是虚拟的。

标签: c# oop interface


【解决方案1】:

您可以在您的实现中使方法为虚拟,例如:

interface IFinal
{
    string YourName();
}

class A: IFinal
{
    public virtual string YourName() { return "Amit"; }
}

class B: IFinal
{
    public virtual string YourName() { return "Joy"; }
}

或者您可以使用 A 和 B 都派生自的通用基础实现,例如

interface IFinal
{
    string YourName();
}

abstract class FinalBase : IFinal
{
    public virtual string YourName() { return string.Empty; }
}

class A : FinalBase
{
    public override string YourName()
    {
        return "A";
    }
}

class B : FinalBase
{
    public override string YourName()
    {
        return "B";
    }
}

class C : A
{
    public override string YourName()
    {
        return "C";
    }
}

new A().YourName(); // A
new B().YourName(); // B

IFinal b = new B();
b.YourName(); // B

FinalBase b = new C();
b.YourName(); // C

【讨论】:

  • @@Winston Smith.. Thx ... 很好的例子
【解决方案2】:

Pankaj - IFinal 中的代码格式和值使您很难弄清楚您要做什么。根据所提供的内容,示例根本无法编译,原因很明显,您已经定义了两次相同的属性(字符串 YourName();)。

你能重做这个问题来澄清你的意图吗? 谢谢

[edit] - 我想我可能“理解”你在问什么 - 即如何定义界面。给你:

public interface IFinal
{   
    string YourName{ get; set; }
}

然后,按照以下方式声明变量:

IFinal classA = new A();
IFinal classB = new B();

那么,尽情狂欢吧:)

【讨论】:

  • @@jim..yes jim.. 我该如何使用这个接口?假设我想通过接口访问A类方法
  • YourName() 是问题中的一种方法,而不是属性。否则,我同意。
  • @pankaj - 见上文关于类的声明。
【解决方案3】:

如果你声明你的接口为

interface IFinal {
string YourName();
}

这两个类都必须实现我认为您所要求的功能。

【讨论】:

  • chuck - 这行不通,你需要get/sett'ers(哎呀,但前提是当然有属性):0
  • 是的,我正在实现字符串 YourName();在 A 和 B 类中,但我如何使用这个接口?假设我想通过接口访问 A 类方法
【解决方案4】:

你有一个接口的反向视图。首先你必须在接口中声明方法,然后你必须在实现接口的类中实现。你走的是另一条路。

首先在接口中声明方法

interface IFinal { 
string YourName(); 
}

然后

Public Class A:IFinal
{
    public string YourName()
    {
        return "Amit";
    }

}

Public Class B:IFinal
{
    public string YourName()
    {
        return "Joy";
    }
}

这里的 A 类和 B 类实现了接口 IFinal 及其方法 YourName()。

调用各个类中的方法

IFinal clsA= new A();
IFinal clsB= new B();

【讨论】:

    【解决方案5】:

    如果你想让IFinal 有两种方法,一种从A 类返回YourName,另一种从B 类返回YourName,那么你需要引入第三个类(我们称之为C),然后将IFinal 上的YourName 方法更改为不同的——你不能在一个接口上拥有两个签名完全相同的方法。

    所以:

    public interface IFinal
    {
        string YourNameA();
        string YourNameB();
    }
    
    public class C : IFinal
    {
        public A A {get; set;}
        public B B {get; set;}
    
        public string YourNameA()
        {
            return this.A.YourName();
        }
    
        public string YourNameB()
        {
            return this.B.YourName();
        }
    }
    

    现在,话虽如此,我不确定这是否是您要问的,或者这样做是否有意义。你必须让我们知道更多关于你想要做什么的细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多