0

我有许多具有以下成员/方法的类:

private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public bool isNamed(String name) { return getName().Equals(name); }

每次我创建一个具有成员“名称”的新类时,我都必须重写所有这些。有没有办法一次编写方法并使它们适用于我想要的任何类?

4

4 回答 4

3

您只需定义一个基类(您可以将其抽象化):

public abstract class Named 
{
    public string Name { get; set; }    
}

并从中继承:

public class Person : Named 
{ 
}

你并不isNamed像在 C# 中那样真正需要,将字符串与==.


如果您的类已经从另一个不是 的类继承Named,您将不得不手动添加Nameauto 属性或求助于模拟多重继承

Named或者,您可以为每个基类创建一个特定的修改:

public abstract class NamedLifeForm : LifeForm
{ 
    public string Name { get; set; }
}

public class Person : NamedLifeForm
{
    // Person inherits both a Name and all relevant members of LifeForm
}

另一种选择是创建一个通用包装器 ,Named<T>它有两个属性:Name和 的实例T。但这会使施工和访问变得麻烦,所以我不推荐它。

于 2013-02-10T16:43:12.907 回答
3

您的代码可以转换为:

public String Name { get;set;}

然后你可以这样使用它:

nObject.Name = "Stefan";
if(nObject.Name == "Stefan"){
   // do something
}else{
   // do something else
}

要自动应用于所有类,您只需将其设置为接口:

public interface INameable{
   public String Name {get;set;}
}

这样做将允许您从其他重要的基类继承。

看这里的例子

class YourClass : INameable{
  //implementation
}

现在,YourClass已自动插入“名称”属性。

于 2013-02-10T16:43:30.363 回答
2

C# 有AutoProperties只是为了:

public String Name {get; set; }

这处理了您谈到的 getName() 和 setName()。

用法:
设置值:Name = "MyName;
获取值:string theName = Name;

于 2013-02-10T16:43:39.147 回答
0

我建议阅读面向对象的编程。您可以为自己节省大量时间和精力(以及质问)。这是一个很好的入门http://www.amazon.com/Beginning-Object-Oriented-Programming-Dan-Clark/dp/1430235306

要回答您的具体问题,您应该阅读有关继承的信息。它使您可以定义具有功能的“父”类。然后您可以继承“子”类并具有相同的功能。

http://msdn.microsoft.com/en-us/library/ms173149(v=vs.80).aspx

这是一个代码示例

public class PersonBase
{
     private String name;
     public String getName()
     {
          return this.name;
     }
     public void setName(string name)
     {
          this.name = name;
     }
     public bool isNamed(string name)
     {
           return this.name.Equals(name);
     }
}

public class Employee : PersonBase
{
}

Employee 现在将拥有 PersonBase 定义的任何内容。

正如其他人指出的那样,您可以使用属性简化代码。此外,您应该在使用“this.name”之前检查空值。

这是指向哪些属性的链接:http: //msdn.microsoft.com/en-us/library/x9fsa0sw (v=vs.80).aspx

简化的代码示例将是:

public class PersonBase
{
     public String Name { get; set; }
}

public class Employee : PersonBase
{
}

我希望这可以帮助您为学习这些概念指明正确的方向。

于 2013-02-10T16:48:54.527 回答