【问题标题】:passing base-type to method将基类型传递给方法
【发布时间】:2012-10-23 15:46:15
【问题描述】:

如果我有两个类,它们是从基类派生的,我该如何编写一个泛型方法,可以操作两个类的继承属性,所以我不需要编写两个方法...

abstract class BaseClass
{
    public int Id { get; set; }
    public string slug { get; set; }
}

public class State:BaseClass
{
    public string StateName{ get; set; }
    public string Description { get; set; }
}

public class City:BaseClass
{
    public string TownName { get; set; }
    public string someOtherProperty{ get; set; }

}

“通用”方法:

public string Slugify( ?????BaseClass???? record)
{
    return record.slug = "...return...something...";
}

调用如下:

string a = Slugify(my_State_object); <--- not working
string b = Slugify(my_City_object);  <--- not working

谢谢!

编辑: State 和 City 是 EF-CodeFirst 类。最初都有 Id 和 slug - 字段。

然后我把它们变成了一个基类,因为我在两个(和其他)表中都有这些。

我想要一个返回 slug 的方法,例如:

public string Slugify(string p, System.Data.Entity.DbSet<Models.BaseRecords> dbSet){ return ...}

像这样称呼

Slugify(text, my_State_object);

还有

Slugify(otherText, my_City_object);

两个调用都给我一个“...一些无效的参数...”错误。

对不起,这是从德语 VS2010 翻译过来的

【问题讨论】:

  • 为什么不能只使用BaseClass作为参数的类型?
  • 请详细说明,Slugify 方法是否需要访问派生类属性?目前它只访问 slug,它是基类的成员,因此是完全合法的。
  • 定义“不工作”,我们可以帮助你。
  • 您是遇到编译错误还是刚刚得到意外结果?
  • 请不要在标题中使用标签:meta.stackexchange.com/questions/19190/…

标签: c# oop inheritance


【解决方案1】:

你已经给出了答案:

public string Slugify(BaseClass record)
{
    return record.slug = "...return...something...";
}

问题是您的 BaseClass 应该与其子类一样可访问。公开就好了:

public abstract class BaseClass ...

【讨论】:

  • 虽然这是正确的,但 OP 的代码中应该存在编译时错误。他们的抽象基类比子类更难访问。
【解决方案2】:

这是因为您的 abstract 基类不是公共的,因此它比其子类更难访问。改成这样:

public abstract class BaseClass
{
    public int Id { get; set; }
    public string slug { get; set; }
}

剩下的代码没问题。

【讨论】:

    【解决方案3】:

    我假设您生成 slug 的方式因每种类型而异。 State 将基于StateName 属性,而City 将使用TownName 属性。

    我认为这可能是一个更好的方法:

    public abstract class BaseClass
    {
        public int Id { get; set; }
        public abstract string Slug { get; }
    }
    
    public class State:BaseClass
    {
        public string StateName{ get; set; }
        public abstract string Slug 
        {
            get 
            {
                return Regex.Replace(StateName, '[^a-zA-Z0-9]', '-');
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      是什么让您不能简单地访问基类的属性?

      Class A
      {
          public string Rawr {get; set;}
      }
      
      Class B : A
      {
          public string Rawr2 { get { return Rawr; } set { Rawr = value; } }
      }
      
      var b = new B();
      b.Rawr = "asdf"
      
      Console.WriteLine(b.Rawr2);
      

      【讨论】:

        【解决方案5】:

        试试这个:

        BaseClass baseClass = new BaseClass();
        baseClass.slug = "initial value";
        Console.WriteLine(baseClass.slug); // displays "initial value"
        Slugify(baseClass);
        Console.WriteLine(baseClass.slug); // displays "...return...something..."
        
        State state = new State();
        state.slug = "initial value";
        Console.WriteLine(state.slug); // displays "initial value"
        Slugify(state);
        Console.WriteLine(state.slug); // displays "...return...something..."
        

        您应该看到您的 Slugify 方法已经可以更改 BaseClass 和 State 类中的属性,只要您去掉问号:

        public string Slugify(BaseClass record)  
        {
            return record.slug = "...return...something...";  
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-03
          • 2011-01-01
          相关资源
          最近更新 更多